Forum: Compiler & IDEs UART Wert auf 16 bit Variable


von saschhaa (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Odenwälder Tannenbaum (Gast)


Lesenswert?

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.

von Odenwälder Tannenbaum (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Odenwälder Tannenbaum schrieb:
> Mit memcpy geht das auch.

Du nutzt allen Ernstes memcpy, um ein einzelnes Byte zu kopieren?

von Fabian O. (xfr)


Lesenswert?

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
Noch kein Account? Hier anmelden.