如何解码 CANbus 的 DBC 定义?
How to decode this DBC definition of CANbus?
我写了一个 .DBC
文件解码器,效果很好。
但是当我添加一个新的硬件 DBC 时,对于以下消息,我的代码没有正确解码这些信号。这是 DBC 部分:
BO_ 2566852816 ERROR_INFO: 8 Vector__XXX
SG_ Slot4_Error_Reserved : 62|7@0+ (1,0) [0|127] "" Vector__XXX
SG_ Slot3_Error_Reserved : 46|7@0+ (1,0) [0|127] "" Vector__XXX
SG_ Slot2_Error_Reserved : 30|7@0+ (1,0) [0|127] "" Vector__XXX
SG_ Slot1_Error_Reserved : 14|7@0+ (1,0) [0|127] "" Vector__XXX
SG_ Slot4_Error_State : 49|3@0+ (1,0) [0|7] "#" Vector__XXX
SG_ Slot3_Error_State : 33|3@0+ (1,0) [0|7] "#" Vector__XXX
SG_ Slot2_Error_State : 17|3@0+ (1,0) [0|7] "#" Vector__XXX
SG_ Slot4_Error_Id : 55|6@0+ (1,0) [0|63] "#" Vector__XXX
SG_ Slot3_Error_Id : 39|6@0+ (1,0) [0|63] "#" Vector__XXX
SG_ Slot2_Error_Id : 23|6@0+ (1,0) [0|63] "#" Vector__XXX
SG_ Slot1_Error_State : 1|3@0+ (1,0) [0|7] "#" Vector__XXX
SG_ Slot1_Error_Id : 7|6@0+ (1,0) [0|63] "#" Vector__XXX
这是我收到的 ERROR_INFO
帧的字节:
04 00 08 00 0D 00 10 00
BMS大师这样解码,我觉得还不错:
Signal
Decoded value
Slot2_Error_Reserved
0
Slot3_Error_Id
3
Slot4_Error_State
0
Slot3_Error_Reserved
0
Slot2_Error_State
0
Slot4_Error_Id
4
Slot4_Error_Reserved
0
Slot2_Error_Id
2
Slot1_Error_Reserved
0
Slot3_Error_State
2
Slot1_Error_Id
1
Slot1_Error_State
0
如果我们关注 Slot1_Error_State
的定义——又名 1|3@0+
——这意味着:
start bit
是 1,也就是第二个;
length
为3位;
- 并且 0 表示大端(1 表示小端);
+
表示无符号。
按照我对DBC格式的理解,从第1位开始3位是无稽之谈。但这证明我错了。
我尝试解码这些值,我成功了,如下:
正如您在我的绘图上看到的,我得到的 ID 和状态与 bmsMaster 找到的相同。
但是,我费尽心思想了解这如何依赖于 DBC 包含的定义。
任何人都可以逐步解释如何应用我在问题开头谈到的两个规则,请问?
混淆来自于您的信号被定义为 big-endian。
当大端和小端混合时,我经常感到困惑。
如果您尝试可视化 Slot1_Error_State
,它实际上应该从 Byte0 最低有效位开始(1,然后是 0)并在 Byte1 最高有效位结束:
我希望这样更有意义!
我写了一个 .DBC
文件解码器,效果很好。
但是当我添加一个新的硬件 DBC 时,对于以下消息,我的代码没有正确解码这些信号。这是 DBC 部分:
BO_ 2566852816 ERROR_INFO: 8 Vector__XXX
SG_ Slot4_Error_Reserved : 62|7@0+ (1,0) [0|127] "" Vector__XXX
SG_ Slot3_Error_Reserved : 46|7@0+ (1,0) [0|127] "" Vector__XXX
SG_ Slot2_Error_Reserved : 30|7@0+ (1,0) [0|127] "" Vector__XXX
SG_ Slot1_Error_Reserved : 14|7@0+ (1,0) [0|127] "" Vector__XXX
SG_ Slot4_Error_State : 49|3@0+ (1,0) [0|7] "#" Vector__XXX
SG_ Slot3_Error_State : 33|3@0+ (1,0) [0|7] "#" Vector__XXX
SG_ Slot2_Error_State : 17|3@0+ (1,0) [0|7] "#" Vector__XXX
SG_ Slot4_Error_Id : 55|6@0+ (1,0) [0|63] "#" Vector__XXX
SG_ Slot3_Error_Id : 39|6@0+ (1,0) [0|63] "#" Vector__XXX
SG_ Slot2_Error_Id : 23|6@0+ (1,0) [0|63] "#" Vector__XXX
SG_ Slot1_Error_State : 1|3@0+ (1,0) [0|7] "#" Vector__XXX
SG_ Slot1_Error_Id : 7|6@0+ (1,0) [0|63] "#" Vector__XXX
这是我收到的 ERROR_INFO
帧的字节:
04 00 08 00 0D 00 10 00
BMS大师这样解码,我觉得还不错:
Signal | Decoded value |
---|---|
Slot2_Error_Reserved | 0 |
Slot3_Error_Id | 3 |
Slot4_Error_State | 0 |
Slot3_Error_Reserved | 0 |
Slot2_Error_State | 0 |
Slot4_Error_Id | 4 |
Slot4_Error_Reserved | 0 |
Slot2_Error_Id | 2 |
Slot1_Error_Reserved | 0 |
Slot3_Error_State | 2 |
Slot1_Error_Id | 1 |
Slot1_Error_State | 0 |
如果我们关注 Slot1_Error_State
的定义——又名 1|3@0+
——这意味着:
start bit
是 1,也就是第二个;length
为3位;- 并且 0 表示大端(1 表示小端);
+
表示无符号。
按照我对DBC格式的理解,从第1位开始3位是无稽之谈。但这证明我错了。
我尝试解码这些值,我成功了,如下:
正如您在我的绘图上看到的,我得到的 ID 和状态与 bmsMaster 找到的相同。
但是,我费尽心思想了解这如何依赖于 DBC 包含的定义。
任何人都可以逐步解释如何应用我在问题开头谈到的两个规则,请问?
混淆来自于您的信号被定义为 big-endian。 当大端和小端混合时,我经常感到困惑。
如果您尝试可视化 Slot1_Error_State
,它实际上应该从 Byte0 最低有效位开始(1,然后是 0)并在 Byte1 最高有效位结束:
我希望这样更有意义!