Forum: Mikrocontroller und Digitale Elektronik Wenn ein Zeichen mehr im String ist, funktioniert das Programm nicht mehr


von Mathias O. (m-obi)


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?

von Holger (Gast)


Lesenswert?

Die Wahrheit wird sich in uart_puts() finden ;)

von Hellseher (Gast)


Lesenswert?

Zeile 274, da ist der Fehler. ;-)

von Test (Gast)


Lesenswert?

Welche lib verwendst du ? Der Sende-Puffer wird zu klein sein (16byte)

von Oldie (Gast)


Lesenswert?

Woraus leitet denn dein Programm das Blinken her?

Mein Programm blinkt nur nach der Frage "Bist du OK?\r\n",
allerdings denn auch nur, wenn es wirklich OK ist...

von Mathias O. (m-obi)


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.

von NurEinGast (Gast)


Lesenswert?

Hellseher schrieb:
> Zeile 274, da ist der Fehler. ;-)

Man soll immer erst in Zeile 42 schauen. Da liegt es meistens dran :-)

von Mathias O. (m-obi)


Lesenswert?

NurEinGast schrieb:
> Hellseher schrieb:
>> Zeile 274, da ist der Fehler. ;-)
>
> Man soll immer erst in Zeile 42 schauen. Da liegt es meistens dran :-)

Er kennt wahrscheinlich den Film nicht ;)

von NurEinGast (Gast)


Lesenswert?

In deiner Main-Schleife ist keine uart Ausgabe zu finden.  Zeig doch mal 
das ganze ....

von Hellseher (Gast)


Lesenswert?

NurEinGast schrieb:
> Hellseher schrieb:
>> Zeile 274, da ist der Fehler. ;-)
>
> Man soll immer erst in Zeile 42 schauen. Da liegt es meistens dran :-)

BuSh, da hast du natürlich recht. Der erste Fehler ist in Zeile 42. Wie 
konnte ich das überhellsehen. ;-)

von DirkB (Gast)


Lesenswert?

Mathias O. schrieb:
> Er kennt wahrscheinlich den Film nicht ;)

Es ist ein Hörspiel fürs Radio.
Dann kamen Bücher ...
... und eine Fernsehserie.

Den Film muss man aber nicht kennen.

von Ulrich H. (lurchi)


Lesenswert?

Ein Zeichen mehr kann das Fass zum Überlaufen bringen, so das 1 byte 
beim RAM fehlt.

von Mathias O. (m-obi)


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.

von Mathias O. (m-obi)


Lesenswert?

DirkB schrieb:
> Mathias O. schrieb:
>> Er kennt wahrscheinlich den Film nicht ;)
>
> Es ist ein Hörspiel fürs Radio.
> Dann kamen Bücher ...
> ... und eine Fernsehserie.
>
> Den Film muss man aber nicht kennen.

Ach danke. Hatte immer im Hinterstübchen, dass es ein Film war. Stimmt 
das waren ja eher Romane.

von NurEinGast (Gast)


Lesenswert?

Verdachtig wäre schon mal, dass Du die Interrupts erst freigibst nachdem 
Du schon 32 Zeichen in den Buffer geschoben hast ....

von Sina A. (sinapse)


Lesenswert?

pack mal sei() vor die uart puts

von TomA (Gast)


Lesenswert?

Hallo Mathias,

kann es sein, daß dein Compiler für jedes Zeichen im string zwei Bytes 
belegt?

Gruß. Tom

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Bastler (Gast)


Lesenswert?

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.

von Mathias O. (m-obi)


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.

von chris (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

chris schrieb:
> 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
Gut, dass man den Sourcecode lesen kann.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

chris schrieb:
> Bei der Fleury-Lib
Du kannst aber gut raten...

> ist puts() blockierend, wenn im Puffer kein Platz
> mehr ist. Und der Puffer wird im Interrupt geleert. Also ist sei()
> vorher nötig
Das kann man sicher im Sourcecode nachsehen.

von chris (Gast)


Lesenswert?

Lothar Miller schrieb:
> Du kannst aber gut raten...

ne, gut lesen :)

Mathias O. schrieb:
> Ich nutze die Lib von Fleury.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

chris schrieb:
> ne, gut lesen :)
Uuups...  :-]

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.