我正在使用 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_table
x之后可以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')"
料青山看我应如是
相关分类