mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Serielle Kommunikation, mehrer Bytes


Autor: Ernst Fall (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo erstmal!

Folgendes Problem: Von einer Visual Basic Form sollen 7 Byte infolge
zum AVR übertragen werden und diese in ein Array speichern. Danach dann
im Programm weitermachen.
Das erste Byte (ist immer 0xFF) signalisiert, jetzt kommen noch 6
weitere.

Ich habe mir das so gedacht:

if ( (UCSRA & (1<<RXC)))
{
 if (UDR == 0xFF)   //Startsignal (Byte 1) empfangen?
 {
  for (i=1;i<=6;i++)
  {
  while (! (UCSRA & (1<<RXC)) ) //warte auf Byte 2..7
  message.data[i] = UDR;
  }
 }
}

Dabei mommt nur Mist raus, als wenn nur sinnlose Zeichen empfangen
werden. Die Baudraten hab ich überprüft, sind überall eingestellt.
Ist der Code so i.O.?

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

Bewertung
0 lesenswert
nicht lesenswert
> while (! (UCSRA & (1<<RXC)) )

Da fehlt ein ;

  while( ! (UCSRA & ( 1 << RXC ) ) )
    ;

Wie ist message.data definiert?
So wie du jetzt die for Schleife aufgesetzt hast,
muss es ein Array der Größe 7 sein. Gewöhn dich
daran, in C wird bei 0 zu zählen angefangen, nicht
bei 1.

Autor: Ernst Fall (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das mit dem Array ist ok, das war nicht das Problem. Wenn ich es so
schreibe, kommt dasselbe bei raus:

while (! (UCSRA & (1<<RXC)) ) //wait..
message.data[1] = UDR;

while (! (UCSRA & (1<<RXC)) ) //wait..
message.data[2] = UDR;

while (! (UCSRA & (1<<RXC)) ) //wait..
message.data[3] = UDR;

while (! (UCSRA & (1<<RXC)) ) //wait..
message.data[4] = UDR;

while (! (UCSRA & (1<<RXC)) ) //wait..
message.data[5] = UDR;

while (! (UCSRA & (1<<RXC)) ) //wait..
message.data[6] = UDR;



Wenn ich bim obigen Beispiel, nicht das UDR reinschreibe, sondern
Konstanten, dann ist auch das Auslesen korrekt, Es werden wieder diese
Konstanten gelesen.

  for (i=1;i<=6;i++)
  {
  while (! (UCSRA & (1<<RXC)) ) //warte auf Byte 2..7
  message.data[i] = 2;
  }

Es muss irgendein Problem zw. dem PC und dem AVR sein.

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

Bewertung
0 lesenswert
nicht lesenswert
Wie oft noch.
Da fehlt ein ';' !

Deine Schleife sagt jetzt aus:

  Solange nichts empfangen wurde
     schreibe den Wert von UDR nach message.data[i]


du willst aber:

  Solange nichts empfangen wurde
     warte

  Schreibe den Wert von UDR nach message.data[i]

Das ist ein kleiner aber feiner Unterschied von genau
einem ';'

Autor: Ernst Fall (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich werd bekloppt! Tatsächlich  das ";" !! Warum auch immer (ok im pdf
hab ich es jetzt auch gesehen)

schönen Dank!!

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unbegrenzte while-Schleifen sind riskant, daher würde ich unbedingt ein
timeout vorsehen. Andernfalls kann das Programm hängen bleiben.
Weiterhin kann man die Routine dahingehend 'verfeinern', indem auf
die FFs neu synchronisiert wird (Nutzdaten != FF), falls die
Übertragung mal gestört wird.

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.