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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren