猿问

如何从此数据类型中提取十六进制值?

我正在使用 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')"



慕尼黑的夜晚无繁华
浏览 98回答 1
1回答

料青山看我应如是

第二个值是 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)
随时随地看视频慕课网APP

相关分类

Python
我要回答