Array aus Variablen bauen

Gast #4722978
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
>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
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
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
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".
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.