#以下三个库自行安装
import cantools
import can
import pandas as pd
#根据字段名(信号)解析报文
def parse_signals(msg1537, msg1539, db):
signal_values = {
#msg1537中的信号
"PosLat": None,
"PosLon": None,
#msg1539中的信号
"GroundVel2D": None,
"VelDown": None,
"VelEast": None,
"VelNorth": None
}
# 解码报文1537和1539的信号值
decoded_msg1537 = db.decode_message(msg1537.arbitration_id, msg1537.data)
decoded_msg1539 = db.decode_message(msg1539.arbitration_id, msg1539.data)
# 将解码的信号值存储到 signal_values 字典中
for signal in decoded_msg1537:
if signal in signal_values:
signal_values[signal] = decoded_msg1537[signal]
for signal in decoded_msg1539:
if signal in signal_values:
signal_values[signal] = decoded_msg1539[signal]
return signal_values
def turn_to():
# 加载DBC文件
dbc_file = r"xxx.dbc"
db = cantools.db.load_file(dbc_file)
# 加载blf文件
f = r"xxx.blf"
log = can.BLFReader(f)
msg_ids = [1537, 1539] #以id为1537, 1539为例
msg_dict = {msg_id: None for msg_id in msg_ids}
signal_data = []
# 遍历CAN日志文件中的每个报文
for msg in log:
if msg.is_extended_id:
msg_id = msg.arbitration_id
else:
msg_id = msg.arbitration_id & 0x7FF
if msg_id in msg_dict:
msg_dict[msg_id] = msg
if all(msg is not None for msg in msg_dict.values()):
signal_values = parse_signals(msg_dict[1537], msg_dict[1539], db)
signal_data.append(signal_values)
msg_dict = {msg_id: None for msg_id in msg_ids}
if signal_data:
df = pd.DataFrame(signal_data)
csv_file_path = "xxx.csv"
try:
df.to_csv(csv_file_path, index=False)
print("CSV file saved successfully.")
except Exception as e:
print("Error saving CSV file:", str(e))
else:
print("No signals found in the message.")
print("Turn Over!!!")
if __name__ == '__main__':
turn_to()
解析后如图: