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

#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?
#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.
#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...
#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren