Forum: Mikrocontroller und Digitale Elektronik Union und Endianess in Avr-GCC


von Robert (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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;

von Robert (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

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.