我正在使用 Pythoncantools库从 CAN dbc 文件中提取消息,返回的数据类型如下所示:message('Message_10', 0x146, False, 8, None),我需要提取第二个值,0x146并且消息名称的长度可能会发生变化,因此标准字符串切片将无法始终如一地工作。我的第一个想法是转换message('Message_10', 0x146, False, 8, None),成一个字符串,然后删除所有不以开头的内容0x,但我怀疑有更好的方法。这样做的目的是从 DBC 文件中提取所有 CAN ID,并创建一个字典,每个罐 ID 号作为键。然后监控 CAN 总线并使用与 CAN 总线上每个 CAN ID 关联的数据有效负载更新目录中的每个值。这是我的代码片段,我最初尝试只提取消息名称,这很有效,但我需要消息 ID,0x146作为我字典中的键,以便在我查看总线上的传入时进行比较任何人都知道如何做到这一点?import cantools db = cantools.database.load_file('C:\\Users\\Tim\\Desktop\\dbc_file.dbc')def can_table(db): messages = [] #pprint.pprint(db.messages) for msg in range(0, len(db.messages)): x = str(db.messages[msg]) x = x[7:] # Remove "message" x = x.replace('(', '').replace(')', '').replace('\'', '') x = x.split(', ') # Split into list messages.append(x[0]) # First element is list is the message name message_table = {} # Populate values as None in dictionary for i in messages: message_table[i]=None #pprint.pprint(message_table) return message_tablex之后可以str()调用的示例:"message('Message_3', 0x143, False, 8, None)""message('Message_2', 0x142, False, 8, None)""message('Message', 0x141, False, 8, None)""message('Message_with_long_name', 0x201, False, 8, 'comment that explains what this message does')"
1 回答

料青山看我应如是
TA贡献1772条经验 获得超8个赞
第二个值是 frame_id。只是做msg.frame_id
。不要将其转换为字符串。
for msg in db.messages: print(msg.frame_id)
从 cantools 代码中,您可以看到使用该方法将消息转换为字符串__repr__
。
cantools.Message.__repr__
def __repr__(self): return "message('{}', 0x{:x}, {}, {}, {})".format( self._name, self._frame_id, self._is_extended_frame, self._length, "'" + self._comment + "'" if self._comment is not None else None)
添加回答
举报
0/150
提交
取消