如何解码来自 canbus 的消息 (Iptronik)

How to decode message from a canbus (Iptronik)

我从 c​​anbus 中检索到以下消息和信号数据(来自 Iptronik sim stg 机器)。我用 python 编码,我使用 python-can 库,我有 ubuntu 18.04

检索到的消息/信号:

Timestamp: 1570622811.311113        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 04 00     Channel: can0
Timestamp: 1570622811.811173        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 0f 06     Channel: can0
Timestamp: 1570622812.311224        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 65 1a     Channel: can0
Timestamp: 1570622812.811266        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 47 0c     Channel: can0
Timestamp: 1570622813.311266        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 2c 58     Channel: can0
Timestamp: 1570622813.811316        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 20 36     Channel: can0

我从 dbc 文件中获得了这些信息。

BO_ 96 DEVICE_51900450_0: 8 C_51900450
  SG_ Beschleunigung : 0|16@1+ (0.000152590218966964,-5) [-5|5] "V" IPETRONIK_CAN_1
  SG_ Pos : 48|16@1+ (0.000152590218966964,0) [0|10] "V" IPETRONIK_CAN_1

当我转换为前 4 位和后 4 位时,我得到的数字与 dbc 文件不对应。

(228, 127, 3, 0)
(228, 127, 3, 0)
(228, 127, 62, 3)
(228, 127, 162, 16)
(228, 127, 143, 28)
(228, 127, 252, 93)

你能帮我或给我一些建议,根据dbc指令正确转换信号吗? 提前谢谢你:)

您可以使用 CAN BUS 工具 (https://cantools.readthedocs.io/en/latest/) 加载您的 .DBC 文件并正确解码您的 CAN 消息:

pip install cantools

示例代码如下:

>>> import cantools
>>> from pprint import pprint
>>> db = cantools.database.load_file('tests/files/dbc/motohawk.dbc')
>>> db.messages
[message('ExampleMessage', 0x1f0, False, 8, 'Example message used as template in MotoHawk models.')]
>>> example_message = db.get_message_by_name('ExampleMessage')
>>> pprint(example_message.signals)
[signal('Enable', 7, 1, 'big_endian', False, 1.0, 0, 0.0, 0.0, '-', False, None, {0: 'Disabled', 1: 'Enabled'}, None),
 signal('AverageRadius', 6, 6, 'big_endian', False, 0.1, 0, 0.0, 5.0, 'm', False, None, None, ''),
 signal('Temperature', 0, 12, 'big_endian', True, 0.01, 250, 229.53, 270.47, 'degK', False, None, None, None)]

这可能对您有所帮助...

import cantools
import can
from pprint import pprint 

db = cantools.database.load_file('******_dbc.dbc') #path of .dbc file
print( db.messages)
can_bus = can.interface.Bus('can0', bustype='socketcan')
message = can_bus.recv()
for msg in can_bus:
     print ( db.decode_message(msg.arbitration_id, msg.data))

在 python 中有这个很棒的库 https://pypi.org/project/cantools/

您可以查看它的源代码来找到您需要提取的字段:https://github.com/eerimoq/cantools/tree/f120d35e1523201b6d87e87306457bf1769330e3

消息和信号的所有相关字段都可以在 cantools/database/can/message.py 和 /database/can/signal.py 中找到 github link

例如:如果您需要名称和信号单位,您可以使用 signal.name 和 signal.unit

提取这些字段的示例代码:

 #**dbc_file** is the full path of dbc 
    db = cantools.database.load_file(dbc_file)
    for msg in db.messages:
        msg_name = msg.name
        msg_id = msg.frame_id
        msg_length = msg.length
        sender = msg.senders
        msg_group = db.get_message_by_name(msg_name)
    
        for signal in msg_group.signals:
            
            #name of signal
            sig_name = signal.name
            #unit of signal
            sig_unit = signal.unit

希望这对某些人有帮助!!!