Forum: Compiler & IDEs Empfangsprobleme mit USART ATmega16


von Chillman (Gast)


Lesenswert?

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;
 }
}

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Chillman (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Chillman (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

> if (UDR=)
Wohl eher
1
if(UDR == XXX)
2
{}
Mit einem "=" gehts garantiert schief!
...

von Chillman (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.