mikrocontroller.net

Forum: Compiler & IDEs Empfangsprobleme mit USART ATmega16


Autor: Chillman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
 }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
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

  // das nächste empfangene Zeichen soll im Array an Position
  // 0 gespeichert werden
  z = 0;

  while(1)
  {

    //
    // warte, bis auf der UART ein Zeichen eingetroffen ist
    //
    while (!(UCSRA & (1<<RXC))) {
    }

    //
    // hole das Zeichen und speichere es ab
    //
    if( z < 4 ) {
      test[z] = UDR;
      z++;

      if( z == 5 ) {
            // es war bereits das 5. Zeichen, mach was mit dem
            // empfangenen

            // das nächste Zeichen kommt wieder an den Anfang
            // des Arrays
        z = 0;
      }
    }
  }
}

Autor: Chillman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chillman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> if (UDR=)
Wohl eher
if(UDR == XXX)
{}
Mit einem "=" gehts garantiert schief!
...

Autor: Chillman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.