PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uart while schleife führt zu absturz



Bremsenreiniger
11.01.2015, 18:30
Hallo,

ich habe ein Problem mit dem UART. Ich benutze die lib von Peter Fleury. Der MC bekommt von einm VB Programm(oder Terminal) Start und Endbefehl
und soll command füllen. Allerdings hängt er sich auf sobald er die while Schleife verlässt, also wenn die 254 gesendet wird. Manchmal funktioniert es ein, zweimal aber meistens gibt er direkt den Geist auf und macht was er will. Setzte ich jedoch delays von 5ms in die while Schleife läuft es(was das Problem ja nicht beseitigt)

Hier die Code Stelle:


ci = 0;
c = uart_getc();
if( c != UART_NO_DATA && c == 250){
//Startbedingung für alle Eingehenden Daten,
//wenn 250 gesendet wird und Daten vorhanden

while( c != 254 ){
// Lese solange, bis von der anderen Seite 254 als Endbedingung kommt!
c = uart_getc();
if(c != UART_NO_DATA) {
command[ci++] = c;
//_delay_ms(5);
uart_putc(c); // überprüfen am terminal
//_delay_ms(5);
}

}

command[ci] = '\0';
}



Weiß einer wo der Fehler liegen könnte?

Peter(TOO)
11.01.2015, 21:17
Hallo,

1. Da fehlt etwas: Wie gross ist command[] ?
Und wie sieht die Deklaration von c und ci aus?

2. Egal wie gross command[] deklariert wird, es besteht die Möglichkeit dass mehr Zeichen gesendet werden, als in command gespeichert werden können.
Dann überschreibst du irgendwelche anderen Daten oder Programmteile!

MfG Peter(TOO)

Übrigens war ein solcher Programm-Fehler die Basis für SASSER, ein typischer Anfängerfehler.

Bremsenreiniger
11.01.2015, 21:40
Hallo,
Die Arrays sollten groß genug sein, ich sende maximal 13 Byte zurzeit.(zum testen einzeln über Terminal)
Hab mir jetzt mal ci über uart ausgegeben. Ci wird immer größer mit delays dauerts was länger ohne delays kommts da denke ich zum überlauf.
Er führt die If - Abfrage nicht nur einmal für ein empfangenes Byte aus sondern öfters obwohl er das nicht dürfte? Habe jetzt UART_NO_DATA alleine abgefragt und die LED, die am PCF angeschlossen ist
schaltet nicht um und bleibt aus. Hier mal der ganze Code im Anhang.
Ich weiß nicht mehr weiter normal sollte ci nur einmal pro Zeichen erhöht werden?

MfG Philipp

Bremsenreiniger
11.01.2015, 23:41
Hallo,

das Problem ist gelöst. Hatte auch bei mikrocontroller.net mein Problem geschildert.
c war als unsigned char deklariert, musste aber als unsigned int deklariert werden, da sonst UART_NO_DATA nicht richtig gesetzt wird.
Der Code im Anhang

MfG Philipp

Peter(TOO)
12.01.2015, 00:17
Hallo Philipp,

c war als unsigned char deklariert, musste aber als unsigned int deklariert werden, da sonst UART_NO_DATA nicht richtig gesetzt wird.
Der Code im Anhang

... und genau diese Informationen hast du geheim gehalten :-(
So kann man nicht helfen!

MfG Peter(TOO)