我正在使用 Pythoncantools庫從 CAN dbc 文件中提取消息,返回的數(shù)據(jù)類型如下所示:message('Message_10', 0x146, False, 8, None),我需要提取第二個值,0x146并且消息名稱的長度可能會發(fā)生變化,因此標準字符串切片將無法始終如一地工作。我的第一個想法是轉(zhuǎn)換message('Message_10', 0x146, False, 8, None),成一個字符串,然后刪除所有不以開頭的內(nèi)容0x,但我懷疑有更好的方法。這樣做的目的是從 DBC 文件中提取所有 CAN ID,并創(chuàng)建一個字典,每個罐 ID 號作為鍵。然后監(jiān)控 CAN 總線并使用與 CAN 總線上每個 CAN ID 關(guān)聯(lián)的數(shù)據(jù)有效負載更新目錄中的每個值。這是我的代碼片段,我最初嘗試只提取消息名稱,這很有效,但我需要消息 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()調(diào)用的示例:"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條經(jīng)驗 獲得超8個贊
第二個值是 frame_id。只是做msg.frame_id
。不要將其轉(zhuǎn)換為字符串。
for?msg?in?db.messages:? ???print(msg.frame_id)
從 cantools 代碼中,您可以看到使用該方法將消息轉(zhuǎn)換為字符串__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
提交
取消