python - 尝试使用 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
知道可能出了什么问题吗?我用谷歌搜索并发现堆栈溢出的类似错误,但它们似乎并不完全相同,而且他们提出的解决方案并不能解决我的问题。
谢谢!
解决方案
我想到了。设备正在发送带有未在 dbc 文件中列出的仲裁 ID 的 CAN 消息,因此给出了密钥错误。键错误是您尝试引用字典中不存在的键的地方。392 是无法识别的 ID。我通过在我的行周围添加一个 try/exception 语句来解决这个问题
decoded = self.dbc.decode_message(can_msg.arbitration_id, can_msg.data)
,然后调查为什么没有为这个特定的消息 ID 准备 dbc 文件。
推荐阅读
- xml - IntelliJ IDEA 中的 XSLT 2 支持
- amibroker - Amibroker 回测有没有办法指定购买价格?
- bash - 如何同时重命名和覆盖 Bash 中的部分文件名?
- amazon-web-services - Logrotate Postrotate aws s3 通配符
- javascript - 如何使用 javascript 突出显示管理侧边栏菜单的树视图部分?
- html - 如何在 Markdown 代码块中以在转换为 HTML 时正确呈现的方式使用美元符号 ($)?
- python - Python将map与groupby和transform结合起来
- go - Golang - 使用 PuerkitoBio/goquery 分别为每个子元素查找文本
- java - 如何在 java11 中获取 TotalSafePointTime
- android - 在自定义适配器中隐藏软键盘