mikrocontroller.net

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


Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef struct 
{
  uint8_t high;
  uint8_t low;
} be_uint16_t;

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

Der Zugriff sieht dann so aus:
  rf_frame.bytes[5] = 5;
  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

Autor: A. K. (prx)
Datum:

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

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
be_uint16_t x;
uint16_t y;

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

zu schreiben. Quasi
x = _macro(y);

Gruß
Robert

Autor: Klaus Wachtler (mfgkw)
Datum:

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

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.