Hallo! Ich will in einer funktion auf das low und highbyte einer int Variablen zugreifen, bis jetzt habe ich das so gelößt: void WriteData2(unsigned char Command, unsigned int Data) { CHECK_BUSSY(STA1_STA0); DATA_WRITE((unsigned char) Data); CHECK_BUSSY(STA1_STA0); DATA_WRITE((unsigned char) Data>>8); Highbyte selektieren CHECK_BUSSY(STA1_STA0); COMMAND_WRITE(Command); } Nun is meine Frage wie oder ob mann das überhaupt mit einen Union lößen könnte; z.b. so union{ unsigned int test; unsigned char Lowbyte; unsigned char Highbyte (Adresse +1???); }; Ich weis das das so net geht, aber wie könnte es denn gehen damit dann dieser aufruf möglich währe void WriteData2(unsigned char Command, unsigned int Data) { CHECK_BUSSY(STA1_STA0); DATA_WRITE(Lowbyte von Date); CHECK_BUSSY(STA1_STA0); DATA_WRITE(Highbyte von Data); CHECK_BUSSY(STA1_STA0); COMMAND_WRITE(Command); } Gruß Stefan
union data{ unsigned int test; unsigned char array[2]; }; void WriteData2(unsigned char Command, union data uData ) { CHECK_BUSSY(STA1_STA0); DATA_WRITE(uData.array[0]); CHECK_BUSSY(STA1_STA0); DATA_WRITE(uData.array[1]); CHECK_BUSSY(STA1_STA0); COMMAND_WRITE(Command); }
#define LOW(x) ((int)x & 0x0FF) #define HIGH(x) ((int)x >> 8) void WriteData2(unsigned char Command, unsigned int Data) { CHECK_BUSSY(STA1_STA0); DATA_WRITE(LOW(Data)); CHECK_BUSSY(STA1_STA0); DATA_WRITE(HIGH(Data)); CHECK_BUSSY(STA1_STA0); COMMAND_WRITE(Command); } so geht das natürlich auch.
Noch 'ne Möglichkeit:
1 | union data |
2 | {
|
3 | unsigned int test; |
4 | struct
|
5 | {
|
6 | unsigned char lowbyte; |
7 | unsigned char high; |
8 | };
|
9 | };
|
10 | |
11 | void WriteData2(unsigned char Command, union data uData) |
12 | {
|
13 | CHECK_BUSSY(STA1_STA0); |
14 | DATA_WRITE(uData.lowbyte); |
15 | CHECK_BUSSY(STA1_STA0); |
16 | DATA_WRITE(uData.highbyte); |
17 | CHECK_BUSSY(STA1_STA0); |
18 | COMMAND_WRITE(Command); |
19 | }
|
Das ist aber ebensowenig portabel wie der Vorschlag von Steffen - Probleme hierbei sind die unterschiedlichen Größen des Datentyps "int", die "endianness" des Prozessors und die Anordnung der Strukturelemente im Speicher (Stichwort "alignment"). Das gleiche ohne "anonyme" Struktur:
1 | union data |
2 | {
|
3 | unsigned int test; |
4 | struct
|
5 | {
|
6 | unsigned char lowbyte; |
7 | unsigned char high; |
8 | } s; |
9 | };
|
10 | |
11 | void WriteData2(unsigned char Command, union data uData) |
12 | {
|
13 | CHECK_BUSSY(STA1_STA0); |
14 | DATA_WRITE(uData.s.lowbyte); |
15 | CHECK_BUSSY(STA1_STA0); |
16 | DATA_WRITE(uData.s.highbyte); |
17 | CHECK_BUSSY(STA1_STA0); |
18 | COMMAND_WRITE(Command); |
19 | }
|
CHECK_BUSSY? Küsschen?!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.