Forum: Mikrocontroller und Digitale Elektronik Array aus Variablen bauen


von Nils (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nils schrieb:
> Welche Möglichkeit gibt es, das eleganter zu machen?

Man könnte anstelle der sechs Variablen gleich die Arrayelemente 
verwenden.

von Nils (Gast)


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?

von Arduinoquäler (Gast)


Lesenswert?

Nils schrieb:
> Wie macht man das?

Wie macht man was?

Nils schrieb:
> eine der Variable ist int aus 4 Bytes.

So wie du es definierst, nicht zwingend .....

unsigned int

ist auf einem AVR 16 Bit, auf einem ARM 32 Bit "groß".

von Georg G. (df2au)


Lesenswert?

Nils schrieb:
> Wie macht man das?

Am besten nicht machen. Denn dafür ist dein Array zu klein.

Ansonsten
a[0] = irgendein_Byte;
a[1] = 24_bit-var;
a[4] = noch_was_als Byte;
usw.

von Nils (Gast)


Lesenswert?

Das funktioniert leider nicht.
send[1] ist korrekt
send[2] und send[3] wurden nicht übernommen.

von Arduinoquäler (Gast)


Lesenswert?

Nils schrieb:
> Das funktioniert leider nicht.

Du sprichst in Rätseln. Was funktioniert leider nicht?

Nils schrieb:
> send[1] ist korrekt
> send[2] und send[3] wurden nicht übernommen.

Du sprichst in Rätseln.

von Dirk B. (dirkb2)


Lesenswert?

Georg G. schrieb:
> Ansonsten
> a[0] = irgendein_Byte;
> a[1] = 24_bit-var;
> a[4] = noch_was_als Byte;
> usw.

Wenn der Typ von a kleiner als der, der 24_bit-var ist, wird nicht der 
gesammte Wert übernommen.

von Dirk B. (dirkb2)


Lesenswert?

Eine (packed) struct wäre auch eine Lösung.

von Nils (Gast)


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

von Georg G. (df2au)


Lesenswert?

Dirk B. schrieb:
> Wenn der Typ von a kleiner als der, der 24_bit-var ist, wird nicht der
> gesammte Wert übernommen.

Dann mach einen Cast. Unsauber ist es eh.

von Arduinoquäler (Gast)


Lesenswert?

Arduinoquäler schrieb:
> So wie du es definierst, nicht zwingend .....
>
> unsigned int
>
> ist auf einem AVR 16 Bit, auf einem ARM 32 Bit "groß".

Beratungsresistenz ist eine Zier,
doch weiter kommt man ohne ihr.

von Georg G. (df2au)


Lesenswert?

Nils schrieb:
> send[0] = Wert_a;
> send[1] = (Wert_b << 8);
> send[4] = Wert_c;

Wo ist die Zuweisung zu send[2] und send[3]?
Und noch einmal: wie gross ist dein unsigned int?

von Nils (Gast)


Lesenswert?

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

von Nils (Gast)


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.

von Arduinoquäler (Gast)


Lesenswert?

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

Nils schrieb:
> Im moment ist das so: (und das funktioniert)

Na was jetzt, so oder so?

von Draco (Gast)


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".

von Draco (Gast)


Lesenswert?

Nils schrieb:
> send[1] = (Wert_b >> 16);
> send[2] = ((Wert_b >> 8) & 0x00FF);
> send[3] = (Wert_b & 0x0000FF);

Nils schrieb:
> Die unsigned int ist 4 Bytes lang


Merkst du deinen Fehler denn nicht selbst?!

von Dirk B. (dirkb2)


Lesenswert?

Nils schrieb:
> das sieht mir aber zu "schlecht" aus.

Das ist aber der richtige Weg.

von Jim M. (turboj)


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.

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.