www.mikrocontroller.net

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


Autor: patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int16 wert = 1244556;

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


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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dr. Gnadenlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Stefan_KM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
}

Autor: Bergie B. (bergie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.