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
Nils schrieb: > Welche Möglichkeit gibt es, das eleganter zu machen? Man könnte anstelle der sechs Variablen gleich die Arrayelemente verwenden.
>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?
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ß".
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.
Das funktioniert leider nicht. send[1] ist korrekt send[2] und send[3] wurden nicht übernommen.
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.
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.
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
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.
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.
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?
der uC hat einen Cortex 32-Bit Kern. Die unsigned int ist 4 Bytes lang
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.
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?
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[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?!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.