Hallo ich hoffe ihr könnt mir helfen ich will über den UART eine 16 bit Variable empfangen also 2 x 8 bit und diese mit switch/ case verarbeiten. Nur spielt mein Atmega2560 da nicht mit. Es werden max. 8 bit immer verarbeitet. Ein Befehl sieht zb. so aus 0xFFFF. Ich wollte das ganze mit der peter fleury Bibliothek realisieren. Ich lese den Wert mit uart_getc (); ein.
saschhaa schrieb: > Ich lese den Wert mit uart_getc (); ein. Damit liest Du keinen 16-Bit-Wert ein. Du muss den Wert als zwei 8-Bit-Werte übertragen und kombinieren. Und dann solltest Du darüber nachdenken, wie Du sicherstellen kannst, daß die beiden 8-Bit-Werte auch wirklich in der richtigen Reihenfolge eintreffen ... und nicht der zweite 8-Bit-Wert einer Übertragung mit dem ersten 8-Bit-Wert der folgenden Übertragung zusammengefasst wird. Schließlich fangen nicht unbedingt beide Seiten der Übertragung zum exakt gleichen Zeitpunkt an zu laufen. Das Stichwort lautet hier Übertragungsprotokoll.
saschhaa schrieb: > Hallo ich hoffe ihr könnt mir helfen > ich will über den UART eine 16 bit Variable empfangen also 2 x 8 bit und > diese mit switch/ case verarbeiten. Nur spielt mein Atmega2560 da nicht > mit. Es werden max. 8 bit immer verarbeitet. Mit memcpy geht das auch. Die zwei byte pufferst du in 8 Bit langen Variablen und kopierst sie per memcpy in das Highbyte des 16Bit Integers und dessen Lowbyte. Kannst es auch reinshiften (ver-ORen mit 1 und dann nach links schieben High-Byte zuerst), je nachdem was schneller ist. IIRC kannst du das Register des UART auch direkt auslesen, dann brauchst du die Hilfsvariablen gar nicht, zumindest eine nicht. Hat der UART nicht noch nen Puffer, IIRC gibt es einen "Trick" dort 2x8Bit zu bevorraten oder war es das USI, schau in die Doku des Prozessors.
Odenwälder Tannenbaum schrieb: > Kannst es auch reinshiften (ver-ORen mit 1 und dann nach links schieben > High-Byte zuerst), je nachdem was schneller ist. Statt bitweises OR muss man nat. AND benutzen.
Odenwälder Tannenbaum schrieb: > Mit memcpy geht das auch. Du nutzt allen Ernstes memcpy, um ein einzelnes Byte zu kopieren?
Rufus Τ. Firefly schrieb: > Odenwälder Tannenbaum schrieb: >> Mit memcpy geht das auch. > > Du nutzt allen Ernstes memcpy, um ein einzelnes Byte zu kopieren? Nein, er kopiert zwei Byte in einen uint16_t. ;-) Ist trotzdem keine gute Idee, da die Bytereihenfolge plattformabhängig ist.
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.