www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik char Array als Struktur interpretieren


Autor: honkytonky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich empfange Kommando-Datenpakete(kein einheitliches Format) über die 
serielle Schnittstelle und speicher diese erstmal in einem char Buffer 
ab.

Ich wollte nun verschiedene structs definieren, und den Buffer je nach 
Datenpaket als einen dieser Structs interpretieren um die Daten 
einfacher verarbeiten zu können und nicht per Indizies auf den Buffer 
zugreifen zu müssen.

Ich weiß aber nun nicht genau, wie ich das anstelle, das ich den Buffer 
als struct interpretieren kann. Muss ich den buffer zu einem struct 
casten?

Irgendwie finde ich bei google kein leicht verständliches Beispiel bzw. 
fehlt mir irgendwie das Stichwort dafür.

Gehen sollte das doch aber irgendwie, oder?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
honkytonky schrieb:

> Ich weiß aber nun nicht genau, wie ich das anstelle, das ich den Buffer
> als struct interpretieren kann. Muss ich den buffer zu einem struct
> casten?

Fast. Du castest dir einen Pointer auf den Anfang des Buffers um zu 
einem Pointer auf die Struktur.
struct irgendwas
{
  int member1;
  int member2;
};

int main()
{
  char buffer[20];
  struct irgendwas* pStruct;

  .... buffer kriegt seinen Wert

  pStruct = (struct irgendwas*)buffer;

  mach was mit pStruct->member1;
  mach was mit pStruct->member2;

Autor: honkytonky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah, vielen Dank!

ich werd das gleich mal probieren

Autor: us73 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch eine Anmerkung:

sowas funktioniert nur zuverlässig auf 8 Bit CPUs (was hier 
wahrscheinlich aber gegeben ist).

Bei > 8 Bit fügt der Compiler u.U. zusätzliche Bytes in die Struktur 
ein, Stichtwort: Alignment.
Je nachdem, was man dem Compiler beim Erstellen dazu mitteilt bzw. zu 
was man ihn auffordert.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Anmerkung:

honkytonky schrieb:
> ich empfange Kommando-Datenpakete(kein einheitliches Format) über die
> serielle Schnittstelle und speicher diese erstmal in einem char Buffer
> ab.

In dem Fall ist die Spielerei mit den Strukturen sowieso eine blöde 
Idee, da zwei Maschinen mit u.U. verschiedenen Endiannesses im Spiel 
sind.

Autor: honkytonky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
öh...Endiannesses?  little endian, big endian oder wie? hmmm...ne, ich 
glaube nicht das ich davon betroffen bin

ja, es handelt sich um eine 8bit CPU und was für Möglichkeiten habe ich 
denn sonst, so eine Datenpaket möglichst geschickt zu parsen??
Die ganze Zeit mit den Buffer-Indizies zu arbeiten ist sehr 
unübersichtlich. Da ist ein bischen Klartext schon hilfreicher.

Und bisher funktioniert das nach der von Karl-Heinz geposteten Methode.

Falls jemand was besseres weiß dann nur her damit. Mich verwirrt diese 
Poiterei nämlich immer recht schnell :(

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, dein Problem ist recht simpel. In der Netzwerktechnik gibt es 
genau deshalb z.B. die Funktionen htons/ntohs usw.

Beispiel:
Du überträgst den Datenstrom zeichen(byte)weise ein. Nun hast du vom 
Sender einen vier Bytes breiten Integer (zwei Bytes reichen natürlich 
auch schon). Der Sender geht hin und überträgt die vier Bytes der Reihe 
nach, von der ersten bis zur vierten Speicherstelle.

Der Empfänger geht nun hin und liest die vier Bytes der Reihe nach und 
schreibt sie hintereinander in die vier Speicherstellen eines Integers.

Was passiert nun, wenn beim Sender die erste Speicherstelle das Byte mit 
den Stellen 0 bis 7 war, beim Empfänger aber das Byte mit den Stellen 
24..31?

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst den Compiler u.U. zwingen, keine Füllbytes in Strukturen 
einzubauen.
Beim GCC gehts (glaube ich) so:
struct test_t {
  int  a;
  char b;
  int  c;
} __attribute__((__packed__));

Autor: us73 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einer 8 Bit CPU ists ja wurscht, ich wollte nur darauf hinweisen.

Weil im Ursprungspost steht nichts von der Zielplattform.


Ich gehe mal davon aus, dass Du Byte-für-Byte über die Leitung schickst, 
und genau weisst, welches Byte wie zu verarbeiten und von welchem 
Datentyp ist.
Ansonsten solltest Du dir natürlich dann nochmal Gedanken zur 
HW-Architektur der Senderseite etc. machen.

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.