Forum: Mikrocontroller und Digitale Elektronik 16bit daten byteweise übertragen


von patrick (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

int16 wert = 1244556;

char b1 = (char)wert
char b2 = (char)(wert>>8)


int16 wert2 = ((int16)b2)<<8 + b1

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Dr. Gnadenlos (Gast)


Lesenswert?

U8 b1, b2;
U16 bVal;

aufdröseln:
b1 = (U8)(bVal/0x100);
b2 = (U8)(bVal%0x100);


zusammenschrauben:
bVal = (U16)b1;
bVal *= 0x100;
bVal += (U16)b2;

von Stefan_KM (Gast)


Lesenswert?

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

von Bergie B. (bergie)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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