Hallo,
danke für Eure Antworten :) Also manchmal sieht man wirklich den Wald
vor lauter Bäumen nicht... Ich wäre nie drauf, dass ich das union in
sizeof vergessen habe. Ich habe kurzerhand mit typedef einen neuen
Datentyp "erstell". Damit hat er dann auch nicht mehr gemeckert :)
@Uwe:
Das mit den Funktionen stimmt vermutlich. Das ganze ist für einen 80kW
Umrichter gedacht. Die CAN-Bytes werden leider im Motorola Format, also
Big-Endian verschickt. Hier vielleicht mal ein Ausschnit so eines
Bitfeldes.
1 | struct BF_SCH_CANHS_R_02
|
2 | {
|
3 | uint64_t BatteryVoltage : 8;
|
4 | uint64_t : 24;
|
5 | uint64_t DCDCActivation : 2;
|
6 | uint64_t : 14;
|
7 | uint64_t DCDCVoltageRegulation : 7;
|
8 | uint64_t WakeUpType : 1;
|
9 | uint64_t SCH_WakeUpSleepCommand : 2;
|
10 | uint64_t APCStatus : 2;
|
11 | uint64_t ETS_SleepMode : 2;
|
12 | uint64_t : 2;
|
13 | };
|
14 |
|
15 | struct BF_PEB_CANHS_R_03
|
16 | {
|
17 | uint64_t : 1;
|
18 | uint64_t DCDCTemp : 7;
|
19 | uint64_t : 2;
|
20 | uint64_t PEBInterlockState : 2;
|
21 | uint64_t ElecMachineWorkingMode : 2;
|
22 | uint64_t VerlogStatus : 2;
|
23 | uint64_t ElecMachineSpeedCRC : 8;
|
24 | uint64_t : 2;
|
25 | uint64_t PEB_CANHS_R_03_Port1 : 1;
|
26 | uint64_t DCDCDefault : 3;
|
27 | uint64_t : 2;
|
28 | uint64_t ElecMachineSpeedClock : 4;
|
29 | uint64_t ElecMachineSpeed : 12;
|
30 | uint64_t ElecMachineMaxGenTorque : 8;
|
31 | uint64_t ElecMachineMaxMotorTorque : 8;
|
32 | };
|
Auslesen tue ich das ganze rückwärts, d.h. das letzte Byte der union
wird in das erste Byte der CAN-Nachricht geschrieben, das vorletzte in
das zweite, usw.
Ich wüsste nicht, wie ich das einfach in eine Funktion schreibe, die das
für ca. 15 Nachrichten immer entsprechnend verrückt und mir die Daten
zurechtbastelt. Dafür bin ich nicht Programmierer genug ;)