Forum: Mikrocontroller und Digitale Elektronik char Array als Struktur interpretieren


von honkytonky (Gast)


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?

von Karl H. (kbuchegg)


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.
1
struct irgendwas
2
{
3
  int member1;
4
  int member2;
5
};
6
7
int main()
8
{
9
  char buffer[20];
10
  struct irgendwas* pStruct;
11
12
  .... buffer kriegt seinen Wert
13
14
  pStruct = (struct irgendwas*)buffer;
15
16
  mach was mit pStruct->member1;
17
  mach was mit pStruct->member2;

von honkytonky (Gast)


Lesenswert?

ah, vielen Dank!

ich werd das gleich mal probieren

von us73 (Gast)


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.

von Sven P. (Gast)


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.

von honkytonky (Gast)


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 :(

von Sven P. (Gast)


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?

von ozo (Gast)


Lesenswert?

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

von us73 (Gast)


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.

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.