Forum: Mikrocontroller und Digitale Elektronik Serielle Kommunikation, mehrer Bytes


von Ernst Fall (Gast)


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.?

von Karl H. (kbuchegg)


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.

von Ernst Fall (Gast)


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.

von Karl H. (kbuchegg)


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

von Ernst Fall (Gast)


Lesenswert?

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

schönen Dank!!

von Michael (Gast)


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.

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.