hallo zusammen ich möchte 16bit integer Werte über eine serielle Schnittstelle bytweise übertragen. Zuerst HighByte dann LowByte. Also muss ich den Integer in zwei Char(Byte) "casten" bzw. aus zwei Byte einen Int machen. Gibt es eine funktion in der C-Standartbibliothek? Oder kennt jemand einen Weg dieses Problem ohne "grossen" Rechenaufwand zu lösen. danke im voraus
int16 wert = 1244556; char b1 = (char)wert char b2 = (char)(wert>>8) int16 wert2 = ((int16)b2)<<8 + b1
Sehr schlicht, LSB vor MSB uint16_t wert; write_serial(*((uint8_t *) &wert)); write_serial(*(((uint8_t *) &wert) + 1)); Für MSB vor LSB sind die beiden Zeilen zu vertauschen.
U8 b1, b2; U16 bVal; aufdröseln: b1 = (U8)(bVal/0x100); b2 = (U8)(bVal%0x100); zusammenschrauben: bVal = (U16)b1; bVal *= 0x100; bVal += (U16)b2;
Du musst dein Integer in 2 Byte "casten". Das Low Byte ist einfach, dass high Byte muss noch um 8 nach rechts geschoben werden und schon kannst du die Bytes übertragen. Beispiel: int data; byte high_data, low_data; void ..... { low_data = data; // oberer Teil wird einfach abgeschnitten high_data = data>>8; // könnte sein, dass das hier nicht funktioniert. // mußt du mal testen. }
Ich habe dafür diesen Weg bevorzugt: typedef union abc_t_t{ USIGN16 _Word; struct{ USIGN8 _low: 8; USIGN8 _high: 8; }Char; }abc_t; ************************ abc_t var; var._Word = 0x1235; write_serial(var._low); write_serial(var._high); LG
> Ich habe dafür diesen Weg bevorzugt:
Aber aufpassen, die Implementation des High- und Low-Byte ist dabei
prozessorabhängig. Da kann dann gut mal über die SIO ein 0x12 0x35 statt
eines 0x35 0x12 kommen.
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.