如何解码来自 canbus 的消息 (Iptronik)
How to decode message from a canbus (Iptronik)
我从 canbus 中检索到以下消息和信号数据(来自 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
希望这对某些人有帮助!!!
我从 canbus 中检索到以下消息和信号数据(来自 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
希望这对某些人有帮助!!!