Wenn ein Zeichen mehr im String ist, funktioniert das Programm nicht mehr

OP #3981726
Lesenswert?
• ▲
▼
Hallo,

wenn ich in meinem Programm
1
uart_puts_P("abcdefghijklmn\r\n");
stehen habe, funktioniert mein Programm (ich hab ein Blinken in der 
Hauptschleife zum testen).
Wenn ich aber
1
uart_puts_P("abcdefghijklmno\r\n");
schreibe, funktioniert es nicht mehr.

weiß jemand womit das zusammenhängen kann? Maximale Stringlänge?
OP #3981751
Lesenswert?
• ▲
▼
Mein blinken ist einfach das toggeln einer LED. Das was wahrscheinlich 
jeder nimmt.
1
    while(1)
2
    {
3
//        eth_get_data();
4
        _delay_ms(500);
5
        PORTD ^= (1 << PD5);
6
    }
Ich nutze die Lib von Fleury.

Natürlich der Puffer. Das macht Sinn.
1
/** Size of the circular receive buffer, must be power of 2 */
2
#ifndef UART_RX_BUFFER_SIZE
3
#define UART_RX_BUFFER_SIZE 32
4
#endif
5
/** Size of the circular transmit buffer, must be power of 2 */
6
#ifndef UART_TX_BUFFER_SIZE
7
#define UART_TX_BUFFER_SIZE 32
8
#endif
Danke.
OP #3981765
Lesenswert?
• ▲
▼
Nagut, damit man es glaubt.
1
void main(void)
2
{
3
//    MCUCR |= (1 << ISC01);
4
//    GICR |= (1 << INT0);
5

6
    DDRD |= (1 << PD5)|(1 << PD6)|(1 << PD7);
7

8
    PORTD |= (1 << PD5);
9
    PORTD |= (1 << PD6);
10
    _delay_ms(200);
11
    PORTD &= ~(1 << PD5);
12
    PORTD &= ~(1 << PD6);
13
    _delay_ms(200);
14

15
    uart_init(UART_BAUD_SELECT(BAUD,F_CPU));
16

17
    uart_puts_P("--- Start ---\r\n");
18

19
    //Applikationen starten
20
//    stack_init();
21
//    testapp_init();
22

23
//    uart_puts_P("Stack initialisiert\r\n");
24
    uart_puts_P("abcdefghijklmno\r\n");
25

26
    sei();
27

28
    while(1)
29
    {
30
//        eth_get_data();
31
        _delay_ms(500);
32
        PORTD ^= (1 << PD5);
33
    }
34
}
Die Schleife hab ich nur wegen dem ominösen Blinken gepostet.
Moderator (Firma: Titel) Persönliche Seite #3981892
Lesenswert?
• ▲
▼
Sina Anargo schrieb:
> pack mal sei() vor die uart puts
Nicht, dass das wirklich was ändern würde oder gar könnte. Der zu kleine 
Puffer wird trotzdem überlaufen. Denn sogar wenn sei() vorher käme, ist 
puts() idR. schneller als die serielle Schnitte.

TomA schrieb:
> kann es sein, daß dein Compiler für jedes Zeichen im string zwei Bytes
> belegt?
Kann, ist aber nicht so. Mit 32 ASCII Zeichen ist ein 32 Byte großer 
Puffer einfach voll.


Und die Antwort auf die Frage ist nicht in der Zeile 42, sondern die 
Antwort selbst ist 42. Das kommt aber nur im Buch so richtig rüber. In 
den Filmen geht das ein wenig unter...
OP #3982017
Lesenswert?
• ▲
▼
Bastler schrieb:
> Das geht auch mit kleinerem Puffer. Nur muß dieser auch geleert werden,
> sonst wartet man ewig, bis wieder Platz frei ist. Und zum Leeren Brauch
> man den Interrupt! Ein ganz simpler Deadlock.
Danke. sei vor den ersten puts gepackt und siehe da, schon funktioniert 
es auch mit langen Strings. Oh man oh man. Ab einer gewissen Uhrzeit 
sollte man ins Bett einfach gehen.
Gast #3982077
Lesenswert?
• ▲
▼
Lothar Miller schrieb:
> Nicht, dass das wirklich was ändern würde oder gar könnte. Der zu kleine
> Puffer wird trotzdem überlaufen. Denn sogar wenn sei() vorher käme, ist
> puts() idR. schneller als die serielle Schnitte.

Bei der Fleury-Lib ist puts() blockierend, wenn im Puffer kein Platz 
mehr ist. Und der Puffer wird im Interrupt geleert. Also ist sei() 
vorher nötig

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.