Gast
#3660625
Hallo, ich möchte eine 32bit Zahl in ein CAN-Frame verpacken, vom RPi verschicken und in einem µC wieder entpacken. Ist das so wie dargestellt richtig?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
|
Anzeige
|
vier 8bit Variablen in eine 32bit Variable
Gast
#3660625
Hallo, ich möchte eine 32bit Zahl in ein CAN-Frame verpacken, vom RPi verschicken und in einem µC wieder entpacken. Ist das so wie dargestellt richtig?
test schrieb: > msg_in_32 = msg.data[7]; > msg_in_32 = 8<<msg_in_32; > msg_in_32 = msg.data[6]; Nope. Hier überschreibst du dir ja msg_in_32 komplett! Das ist nicht das was du willst. Denn selbst, wenn die vorhergehenden Operationen korrekt gewesen wären, wäre damit der 'Beitrag' von msg.data[7] komplett 'aus dem Rennen' genommen worden. Zuweisung ist Zuweisung. Und dabei wird der linke Teil von der Zuweisung unter Beachtung seines Datentyps komplett beschrieben. Ausserdem stimmt die Angabe beim Verschieben nicht a << b bedeutet: verschiebe den Inhalt von a um b Bits nach links. Genauso wie a >> b bedeutet: verschiebe den Inhalt von a um b Bits nach rechts. Links von der Operation, egal ob << oder >>, steht das "womit". Und rechts von der Operation steht um "wieviele" Bits. Liest du denn kein C Buch, ehe du mit programmieren anfängst? Da wirst du noch ein paar mal schön auf die Schnauze fallen.
Gast
#3660648
Wie kann ich dann das Problem lösen? Hallo, ich denke*, Du suchst etwas wie das Folgende, wobei msg_in_32 den übertragenen Wert enthält, der in die 4 Array-Werte msg.data[x] "aufgesplittet" wird.
*Oder habe ich mal wieder einen kapitalen Denkfehler gemacht? ;-) Tobias S. schrieb: > Hallo, > > ich denke*, Du suchst etwas wie das Folgende, wobei msg_in_32 den > übertragenen Wert enthält, der in die 4 Array-Werte msg.data[x] > "aufgesplittet" wird. > >
> > *Oder habe ich mal wieder einen kapitalen Denkfehler gemacht? ;-) Falsche Datenflussrichtung. Er hat die 4 Einzelwerte und will sie zusammensetzen. test schrieb: > Wie kann ich dann das Problem lösen? Na, ja. Die 4 Bytes eben geeignet verschoben wieder zusammensetzen.
ein bischen optimieren könnte man das noch bezüglich der Casts. Hallo Karl Heinz, ich zitiere mal von oben:
für mich sah das so aus, dass er schon über CAN gesendet hat und den 32bitter wieder auseinanderpfriemeln will, daher auch der Name msg_*in*_32. Wie gesagt, wäre aber nicht das erste Mal, dass ich mich irre ;-)
Gast
#3660666
Hallo Test, fasse deine Variablen, auf beiden Seiten, in einer "union" zusammen und das Problem ist gelöst. Gruß. Tom packed union, um sicherzugehen :-)
Gast
#3660677
TomA. schrieb: > fasse deine Variablen, auf beiden Seiten, in einer "union" zusammen und > das Problem ist gelöst. Ja, aber nur wenn Ziel&Quell -Platform die selbe Endianness haben. Ansonsten sind die Bytes falsch herum. Wenn man hingegen Bitshifts wie oben verwendet, stellt der Compiler sicher dass sie immer die richtige Reihenfolge haben (LE in diesem Fall). So bleibt der Code portabel.
Gast
#3660685
Karl Heinz schrieb:
Ich werde es genau so machen. Danke! Karl Heinz schrieb: >>
>> >> *Oder habe ich mal wieder einen kapitalen Denkfehler gemacht? ;-) > > Falsche Datenflussrichtung. Nicht nur das. Maskieren von Nibbles statt Bytes ist hier wenig zielführend. ;-)
Gast
#3660881
msg.data[4] = (msg_in_32 & 0x000000FF); msg.data[5] = (msg_in_32 & 0x0000FF00) >> 8; msg.data[6] = (msg_in_32 & 0x00FF0000) >> 16; msg.data[7] = (msg_in_32 & 0xFF000000) >> 24; oder erst schieben, und dann maskieren. ist dann immer 0xff: .. msg.data[4] = (msg_in_32 >> 0 ) & 0xff; msg.data[5] = (msg_in_32 >> 8 ) & 0xff; msg.data[6] = (msg_in_32 >> 16 ) & 0xff; msg.data[7] = (msg_in_32 >> 24 ) & 0xff; .. Wenn msg.data[] vom typ unsigned char ist, kann man sich das maskieren mit 0xff sparen, weil nicht mehr Bits reinpassen.
Gast
#3661038
Mit Zeigern kann man das Ganze doch einfacher machen oder?
Gast
#3661044
hp-freund schrieb: > Mit Zeigern kann man das Ganze doch einfacher machen oder? Dann hast du aber genau das gleiche Problem wie mit unions: Dr. Sommer schrieb: > TomA. schrieb: >> fasse deine Variablen, auf beiden Seiten, in einer "union" zusammen und >> das Problem ist gelöst. > Ja, aber nur wenn Ziel&Quell -Platform die selbe Endianness haben. > Ansonsten sind die Bytes falsch herum. Wenn man hingegen Bitshifts wie > oben verwendet, stellt der Compiler sicher dass sie immer die richtige > Reihenfolge haben (LE in diesem Fall). So bleibt der Code portabel.
Gast
#3661046
Ok. Das ist Richtig.
Gast
#3661048
hp-freund schrieb: > Mit Zeigern kann man das Ganze doch einfacher machen oder? nur wenn du immer auf gleichen (Big|Little) Edian-Systemen arbeitest. Auch mit memcpy kann man arbeiten, aber das gleichen Problem. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|