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.?
> 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.
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.
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 ';'
ich werd bekloppt! Tatsächlich das ";" !! Warum auch immer (ok im pdf hab ich es jetzt auch gesehen) schönen Dank!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.