首页 > 解决方案 > 尝试使用 dbc 文件解码 CAN 消息时出现 KeyError:392?

问题描述

我正在尝试使用制造商提供的 dbc 文件从设备解码 CAN 消息。我正在使用 Python 3.8.5。要加载/设置 dbc 文件,我有:

import can
import cantools

self.bus = can.interface.Bus('slcan0', bustype='socketcan',bitrate=250000)
listener = can.Listener()
listener.on_message_received = self.callback
self.dbc = cantools.database.load_file(dbc_file_path,strict=False) #need strict=False or it raises errors for overlapping signals for some reason

在回调函数中我有:

def callback(self, can_msg):
    decoded = self.dbc.decode_message(can_msg.arbitration_id, can_msg.data)

该脚本运行,但是一旦它从设备接收到 CAN 消息,它就会给我以下错误:

Traceback (most recent call last):                                                                       
  File "/home/.local/lib/python3.8/site-packages/cantools/database/can/database.py", line 385, in decode_message                                                                                            
    message = self._frame_id_to_message[frame_id_or_name]
KeyError: 392

知道可能出了什么问题吗?我用谷歌搜索并发现堆栈溢出的类似错误,但它们似乎并不完全相同,而且他们提出的解决方案并不能解决我的问题。

谢谢!

标签: pythoncan-bus

解决方案


我想到了。设备正在发送带有未在 dbc 文件中列出的仲裁 ID 的 CAN 消息,因此给出了密钥错误。键错误是您尝试引用字典中不存在的键的地方。392 是无法识别的 ID。我通过在我的行周围添加一个 try/exception 语句来解决这个问题 decoded = self.dbc.decode_message(can_msg.arbitration_id, can_msg.data),然后调查为什么没有为这个特定的消息 ID 准备 dbc 文件。


推荐阅读