Union und Endianess in Avr-GCC

Gast #1294617
Hallo!

Ich würde gerne ein Datenframes sowohl in Form von strukturierten Werten 
als auch als Bytearray (zum seriellen Senden) zugreifen. Das ganze sieht 
so aus:
1
typedef struct 
2
{
3
  uint8_t high;
4
  uint8_t low;
5
} be_uint16_t;
6

7
union rf_frame_t
8
{
9
  uint8_t bytes[28];
10
  struct values_t
11
  {
12
    uint8_t dummy[8];
13
    be_uint16_t channel1;
14
    be_uint16_t channel2;
15
    be_uint16_t channel3;
16
    be_uint16_t channel4;
17
  } values;
18
} rf_frame;

Der Zugriff sieht dann so aus:
1
  rf_frame.bytes[5] = 5;
2
  rf_frame.values.channel1.low = 5;

Mich würde nun interessieren: Geht es besser? So würde ich z.B. gerne 
die "values" weglassen und direkt per rf_frame.channel1.low auf den Wert 
zugreifen. Kann man anders das BigEndian-Format erzwingen als mit low- 
und high-byte?

Gruß
Robert
Lass den Namen "values" weg, gibt anonyme struct und schreibt sich 
kürzer. Also:

union rf_frame_t
{
  uint8_t bytes[28];
  struct
  {
    uint8_t dummy[8];
    be_uint16_t channel1;
    be_uint16_t channel2;
    be_uint16_t channel3;
    be_uint16_t channel4;
  };
} rf_frame;

rf_frame.channel1.low = 5;
Gast
Hi A.K.,

vielen Dank für den Tipp - das hat schon mal super funktioniert.

Jetzt suche ich noch irgend eine Lösung um die Endianess zu ändern. 
Evtl. auch ein Makro was es mir erspart
1
be_uint16_t x;
2
uint16_t y;
3

4
x.high = y >> 8;
5
x.low = y;

zu schreiben. Quasi
1
x = _macro(y);

Gruß
Robert
htons() konvertiert eine uint16_t vom aktuellen Format
(LE oder BE, je nach Rechner) in die "network byte order",
also BE.
ntohs() wandelt von BE auf das aktuelle Format.

Auf einem BE-Rechner machen die beiden Funktionen also effektiv
nichts, auf einem LE-Rechner vertauschen sie die Bytes.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.