Serielle Kommunikation, mehrer Bytes

Gast #399357
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.?
#399358
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.
Gast #399359
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.
#399360
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 ';'
Gast #399362
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.