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.
 Thread beobachten
 Thread beobachten Seitenaufteilung abschalten
 Seitenaufteilung abschalten