发表评论
由《cantools库 ①快速了解入门》知道,使用cantools.database.load_file()读取的DBC文件包含以下信息:
DBC文件版本
节点信息
message信息(包含具体signal信号)
我们可以使用cantools对其进行进一步解析,这里我们重点介绍对于message信息的解析。
可以使用 dbc.messages 方法对DBC中的Message对象进行打包,并批量显示。Message对象将会被打包成列表数据。
import can
import cantools
import cantools.database
import cantools.database.can.signal
if __name__ == "__main__":
dbc1 = cantools.database.load_file("dbc/can_test.dbc") #解析DBC文件
#1.读取message/nodes/buses对象
dbcx = dbc1.messages #打包文言message对象
#dbcy = dbc1.nodes #打包节点nodes对象
#dbcz = dbc1.buses #打包总线nodes对象
print(dbcx)输出如下:
这里列表内信号格式为:message('THU_516', 0x516, False, 32, None),其含义为:'THU_516'为其mesaage的name,0x516为message的id。
[message('THU_50A', 0x50a, False, 8, None), message('GW_3FC', 0x3fc, False, 64, None), message('GW_28B', 0x28b, False, 8, None), message('GW_17A', 0x17a, False, 64, None), message('THU_530', 0x530, False, 8, None), message('THU_516', 0x516, False, 32, None)]在步骤1中,获取到message('THU_516', 0x516, False, 32, None)这个信号,所以可以使用'THU_516'或者0x516来解析单个meaasge。
import can
import cantools
import cantools.database
import cantools.database.can.signal
if __name__ == "__main__":
dbc1 = cantools.database.load_file("dbc/can_test.dbc") #解析DBC文件
#1.读取message/nodes/buses对象
dbcx = dbc1.messages #打包文言message对象
#messagex = dbc1.get_message_by_name("THU_516") #通过name获取报文对象
messagey = dbc1.get_message_by_frame_id(0x516) #通过id地址获取报文对象
print(messagey)这里分别使用了dbc.get_message_by_name()函数和dbc.get_message_by_frame_id()函数。其输出入下:
message('THU_516', 0x516, False, 32, None)import can
import cantools
import cantools.database
import cantools.database.can.signal
if __name__ == "__main__":
dbc1 = cantools.database.load_file("dbc/can_test.dbc") #解析DBC文件
signalx = dbc1.get_message_by_frame_id(0x516).signals #通过message获取message对象,并通过signals获取信号对象
print(signalx)这里通过对message对象使用.signal方法来获取signal对象列表。输出如下:
[signal('HU_CurrentLocationValid', 7, 1, 'big_endian', False, 0, 1, 0, 0, 1, '/', False, None, None, None, None), ... ...]这里每个signal我们可以通过遍历来单独输出,其具体含义为:
# 打印信号详细信息
for signal in signalx:
if signal.name =="IP_TotalOdometer": #筛选信号
cantools.database.decode_signal(signal, raw_value)
print(f"Name: {signal.name}")
print(f"Start bit: {signal.start}")
print(f"Bit length: {signal.length}")
print(f"byte_order: {signal.byte_order}")
print(f"Is_signed: {signal.is_signed}")
print(f"raw_initial: {signal.raw_initial}")
print(f"Raw_invalid: {signal.raw_invalid}")
print(f"conversion: {signal.conversion}")
print(f"Minimum: {signal.minimum}")
print(f"Maximum: {signal.maximum}")
print(f"Unit: {signal.unit}")
print(f"comment: {signal.comment}")
print(f"receivers: {signal.receivers}")
print(f"is_multiplexer: {signal.is_multiplexer}")
print(f"multiplexer_ids: {signal.multiplexer_ids}")
print(f"multiplexer_signal: {signal.multiplexer_signal}")
print(f"offset: {signal.offset}")
print(f"spn: {signal.spn}")-完-