Array aus Variablen bauen

Gast #4722978
Lesenswert?

Hallo alle,

die Frage mag sehr easy erscheinen, aber ich komme gerade nicht weiter.
Ich habe ein Array bestehend aus 6 Bytes.
volatile unsigned char send[6] = { 0,0,0,0,0,0 };

Dazu noch 6 Variablen, die ich ins Array packen will und das Array 
nachher per UART verschicken.
Das ganze weil der von mir benutzte uC schneller die Arrays verschickt 
als einzelne Bytes hintereinander.
volatile unsigned char a,b,c,d,e,f;

So, nun könnte ich einfach
send[0] = a;
send[1] = b;
send[2] = c;
usw schreiben, aber das sieht mir zu komisch aus.

Welche Möglichkeit gibt es, das eleganter zu machen?

Vielen Dank
Schönes Wochenende
Gast #4722994
Lesenswert?

>Man könnte anstelle der sechs Variablen gleich die Arrayelemente
>verwenden.
Vielen Dank, warum bin ich bloß drauf nicht selbst gekommen.

Noch eine Frage, wenn ich darf:
eine der Variable ist int aus 4 Bytes.
also
unsigned char a = 0x11;
unsigned int b = 0x112233
unsigned char c = 0x00;
unsigned char d = 0x33;

Wie macht man das?
Gast #4723066
Lesenswert?

Ok, sorry.
Noch mal:
volatile unsigned char send [6] = { };
volatile unsigned char Wert_a = 0x11;
volatile unsigned int Wert_b = 0x223344;
volatile unsigned char Wert_c = 0x55;
volatile unsigned char Wert_d = 0x66;

send[0] = Wert_a;
send[1] = (Wert_b << 8);
send[4] = Wert_c;
usw...

Die Daten in send[2] und send[3] sind falsch. Und zwar 0, wie bei der 
Initialisierung

Danke
Gast #4723083
Lesenswert?

Im moment ist das so: (und das funktioniert)
send[0] = Wert_a;
send[1] = (Wert_b >> 16);
send[2] = ((Wert_b >> 8) & 0x00FF);
send[3] = (Wert_b & 0x0000FF);
send[4] = Wert_c;
send[5] = Wert_d;
das sieht mir aber zu "schlecht" aus.
Gast #4723090
Lesenswert?

Nils schrieb:
> der uC hat einen Cortex 32-Bit Kern.
> Die unsigned int ist 4 Bytes lang

Siehste, und da stößt du auf deine Probleme!

Also dann rechne mal, du hast Wert_a (1Byte), Wert_b (4Byte), Wert_c 
(1Byte), Wert_d (1Byte)... Das sind schonmal 7 Byte. Also brauchst du 
bei einem Char Array mindestens ein Größe von 7.

char send[7];


Dann teilst du deinen 32byte Integer einfach mit Bitshiften auf 
send[1-4] auf.

send[0,5,6] weißt du dann halt die Char Wert_a/c/d zu und fertig. Auf 
dem Zielsystem shiftest du dann halt byte 1-4 wieder "zusammen".
#4723472
Lesenswert?

Nils schrieb:
> send[0] = Wert_a;
> send[1] = (Wert_b >> 16);
> send[2] = ((Wert_b >> 8) & 0x00FF);
> send[3] = (Wert_b & 0x0000FF);
> send[4] = Wert_c;
> send[5] = Wert_d;
> das sieht mir aber zu "schlecht" aus.

Geht kaum anders. Wert_b wird nicht aligned und auch noch Big Endian 
übertragen (und die obersten 8 Bit abgeschnitten). Cortex M3 ist aber 
little endian.

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