如何解决KeyError: 392 在尝试使用 dbc 文件解码 CAN 消息时?
我正在尝试使用制造商提供的 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 文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。