struct's mit avr-gcc

Gast #76632
Lesenswert?
• ▲
▼
Hallo,

habe mal wieder eine kleine C-Frage, bei dir mir meine Literatur (C-
Das Grundlagen Buch) nicht weiter hilft.

Ich habe eine Struktur wie folgt definiert:

struct motordaten {
  unsigned char nr: 1;
  unsigned char v: 3;
  unsigned char dir: 1;
  unsigned char mod: 2;
};
typedef struct motordaten mdaten;

Das funktioniert soweit auch, nur erfordert es meine Anwendung, dass
ich eine Variable vom Typ mdaten zu einem unsigned char konvertieren
möchte.

mdaten testvariable;
unsigned char anderevariable;
anderevariable = (unsigned char) testvariable;

Hierbei bringt mir avr-gcc allerdings nur Fehlermeldungen. Eigentlich
sollten ja beide Variablen 1 Byte groß sein ?!

Alex
Gast #76633
Lesenswert?
• ▲
▼
Hat keiner eine Idee?
Das Problem ist, dass die Motorsteuerung über das SPI erfolgen soll und
es praktischer ist, alle 4 Parameter mit einer 8Bit Variablen zu
übergeben, anstatt extra 4 Byte zu senden.
Eigentlich legt doch die Deklaration einer Variablen lediglich fest,
wie eine Variable zu interpretieren ist. Da meine neu definierter
Datentyp die gleiche Größe (?) wie ein unsigned char hat, sollte doch
eine Hin- und auf Empfängerseite Rückkonvertierung kein Problem sein.
Habe ich eventuell Syntaxfehler oder ein generelles
Verständnisproblem?

Alex
Gast #76634
Lesenswert?
• ▲
▼
Ja, Du hast ein generelles Verständnisproblem.  Auch wenn's ein
Bitfeld ist, es bleibt eine Struktur, und die kann man nicht einfach
auf einen Skalarwert casten.

union ist das Stichwort.  Den Rest findest Du in jedem C-Buch.
Gast #76635
Lesenswert?
• ▲
▼
Hi!

Ich glaube, das was Du vor hast, das funktioniert so direkt nicht.
Du kannst eine struct nicht einfach auf einen einfachen Datentyp wie
int konvertieren.

Was aber gehen müsste: Du brauchst einen Zeiger auf einen unsigned
char, und diesen lässt Du auf die Adresse der struct zeigen.
mdaten testvariable;
unsigned char * andereVariable = (unsigned char*)&testvariable;
Mit diesem Zeiger kannst Du nun direkt auf das Byte zugreifen.
Ich weiss nicht genau was Du hiermit machen willst, aber Du solltest
beachten, dass die Anordnung der einzelnen Bits nicht in der
Sprachdefinition festgelegt ist und jeder Compiler die einzelnen Bits
anders anordnen kann, also in Deinem Fall liegt das Bit "nr"
vielleicht mal ganz vorne im Byte, vielleicht aber auch ganz hinten...

Daher wäre es vielleicht sicherer, "von Hand" aus der struct ein Byte
zu machen. Also in etwa so:
unsigned char andereVariable = (testvariable.nr << 6) | (testvariable.v
<< 3) | (testvariable.dir << 2) | (testvariable.mod);
Dann weisst Du wenigstens sicher, was an welcher Stelle im Byte steht,
unabhänging vom verwendten Compiler.

Bye
 Daniel

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren