Hallo, ich hab hier einen Code mit dem ich 5 Zeichen über die Uart empfangen will. die zeichen werden auch definitiv vom PC gesendet, das hab ich schon überprüfft. ich speicher die zeichen in einem unsigned char array und geb sie dann wieder an den PC aus. allerdings fehlt dabei immer 1 zeichen, meistens das 2 zeichen. z.b. bei "test1" kommt nur "tst1" zürück. das senden eines arrays klappt ohne jegliche probleme, mit den gleichen einstellungen was baudrate und co angeht,das hab ich auch schon in nem anderen teil programmiert. ich vversteh aber nicht warum dies so problematisch ist. hab in der while (z<=4) schon diverse reihenfolgen der zeilen ausprobiert, so klappt es noch am besten bei mir. unsigned char test[5]; unsignede char z; int main(void) { UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 UBRRH=0; UBRRL =53; /* Faktor aus ((CPU_C/(Boud*16))-1); */ UCSRB &= ~(1<<TXEN); //deaktiviert das Senden über Uart UCSRB |= (1<<RXEN); //aktiviert das Empfangen über Uart while(1) { if (UDR!=0) { while (z<=4) { test[z]=UDR; z++; while (!(UCSRA & (1<<RXC))) {} } z=0; } }
Chillman wrote: > problematisch ist. hab in der while (z<=4) schon diverse reihenfolgen > der zeilen ausprobiert Einfach 'diverse Reihenfolgen' an Befehlen durchzuprobieren ist selten eine gute Strategie. Nachdenken in welcher Reihenfolge die Dinge passieren muessen ist da wesentlich besser.
1 | unsigned char test[5]; |
2 | unsignede char z; |
3 | |
4 | int main(void) |
5 | {
|
6 | UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 |
7 | UBRRH=0; |
8 | UBRRL =53; /* Faktor aus ((CPU_C/(Boud*16))-1); */ |
9 | UCSRB &= ~(1<<TXEN); //deaktiviert das Senden über Uart |
10 | UCSRB |= (1<<RXEN); //aktiviert das Empfangen über Uart |
11 | |
12 | // das nächste empfangene Zeichen soll im Array an Position
|
13 | // 0 gespeichert werden
|
14 | z = 0; |
15 | |
16 | while(1) |
17 | {
|
18 | |
19 | //
|
20 | // warte, bis auf der UART ein Zeichen eingetroffen ist
|
21 | //
|
22 | while (!(UCSRA & (1<<RXC))) { |
23 | }
|
24 | |
25 | //
|
26 | // hole das Zeichen und speichere es ab
|
27 | //
|
28 | if( z < 4 ) { |
29 | test[z] = UDR; |
30 | z++; |
31 | |
32 | if( z == 5 ) { |
33 | // es war bereits das 5. Zeichen, mach was mit dem
|
34 | // empfangenen
|
35 | |
36 | // das nächste Zeichen kommt wieder an den Anfang
|
37 | // des Arrays
|
38 | z = 0; |
39 | }
|
40 | }
|
41 | }
|
42 | }
|
oh ich seh ich hab da was zuviel am progi gespielt, das bei if-abfrage sollte (UDR=='t') drin stehen. was ist denn an meinem progi verkehrt? darf ich die abfrage nach dem UDR nicht machen? mit einem einzelnen "r" z.b steuer ich bereits einen anderen prozess. das mit dem array sollte nur dann inizialisert werdenm wenn ich "test1" rüberschicke.
Chillman wrote: > was ist denn an meinem progi verkehrt? darf ich die abfrage nach dem UDR > nicht machen? Doch, darfst du. Ist aber meist nicht sehr schlau. Aber vor allen Dingen solltest du dich an die Reihenfolge halten: Zuerst nachsehen bzw. warten bis ein Zeichen eintrifft und erst dann das Zeichen abholen
jo, danke! hab es nun abgewandelt, wobei bei einer direktenabfrage von UDR in if (UDR=) immer das zweite zeichen bei mir scheinbar verloren geht, versteh ich bis jetzt noch nicht, wenn ich aber das erste zeichen direkt nach while (!(UCSRA & (1<<RXC))) {} in eine variable ablege und dann die variable in der if-anweisung abfrage, dann klappts ohne verluste.
> if (UDR=)
Wohl eher
1 | if(UDR == XXX) |
2 | {}
|
Mit einem "=" gehts garantiert schief! ...
ja hatte es in der form gehabt if(UDR=='0') um genau zu sein, nur damit fehlte mir immer das 2te zeichen ka wieso das so ist.
Chillman wrote: > ja hatte es in der form gehabt if(UDR=='0') um genau zu sein, nur damit > fehlte mir immer das 2te zeichen ka wieso das so ist. Das wird irgendeine race-condition gewesen sein, bei der dein Code einfach nur zu spät gekommen ist, um das Zeichen abzuholen. Sauschwer sowas zu finden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.