【CAN】asc报文格式文件合并(python版)
目录
一、简介
CAN通讯可以有多个从机或主机节点,分别具有CAN接收和发送功能,它们将信号发送到总线,同时也从总线上接收其他节点的信号,信号的传输方式分别是CANH(高电平)和CANL(低电平),具体信息流图如下所示:
详细内容可以看这个博文:https://blog.csdn.net/qq_29350001/article/details/134850490
二、合并asc格式报文
asc报文文件的合并过程:(1)准备多个asc文件;(2)根据时间将多个asc文件拼接到一个文件中。
1、准备多个asc文件
这里准备三个文件作为示例进行合并测试。
示例1文件名:2.txt
date Sunday Mar 11 20:36:00 2024
base hex timestamps absolute
// version 2.1
74159.2757 2 18FED900x Rx d 8 00 00 0C 0F 3F 00 0C 01
74159.2763 1 18F00E00x Rx d 8 00 00 00 00 00 00 00 00
74159.2763 2 18F00A00x Rx d 8 FF FF 00 00 FF FF FF FF
74159.2768 1 00000074x Rx d 8 CE 13 00 00 00 00 00 00
74159.2769 2 18FEDF00x Rx d 8 81 FF FF FF 00 00 00 00
end
示例2文件名:3.txt
date Sunday Mar 11 20:37:00 2024
base hex timestamps absolute
// version 2.1
74219.2712 1 000001B4x Rx d 8 00 00 00 00 00 00 00 00
74219.2718 1 18EB0000x Rx d 8 00 A0 00 00 00 00 00 A8
74219.2724 1 0C41A800x Rx d 8 00 00 00 00 00 00 00 00
74219.2730 1 0C41A804x Rx d 8 00 00 00 00 00 00 00 00
end
示例3文件名:4.txt
date Sunday Mar 11 20:35:00 2024
base hex timestamps absolute
// version 2.1
74099.2804 2 0C0000E4x Rx d 8 71 20 1C 00 FF 00 FF FF
74099.2807 1 00000280x Rx d 8 00 00 15 00 7F 00 37 01
74099.2811 2 0CF00300x Rx d 8 FA FE 00 00 FF FF FF FF
end
2、根据时间合并asc文件
根据上述提供的三个asc文件,使用下面的python脚本对三个文件的内容进行合并。
python脚本文件名:main.py
,具体内容如下:
# @Time : 2024-12-09 10:47
# @Author : 'IReverser'
# @FileName: main.py
import glob as glob
def del_special_v(data, index_list):
indexs = [[i, i + 1, i + 2] for i in index_list]
index_process = [item for sublist in indexs for item in sublist]
filtered_list = [item for i, item in enumerate(data) if i not in index_process]
# print(filtered_list)
return filtered_list
if __name__ == '__main__':
data_file = "./data/"
res_file_path = ".res.asc"
date_list = []
data_list = []
index = []
for i in glob.glob(data_file + "*.asc"):
print(f"{i}")
with open(i) as f:
d = f.readlines()
d.pop(-1)
# d[-1] = d[-1] + "\n"
index.append(len(d))
data_list.append(d)
date_list.append(d[0].split(" ")[-2])
# print(date_list)
# print(data_list)
print(index)
sorted_times_with_index = sorted(enumerate(date_list), key=lambda x: x[1])
sort_data_list = [data_list[ind] for ind, _ in sorted_times_with_index]
sort_data_list = [item for sublist in sort_data_list for item in sublist]
sorted_index = [index[ind] for ind, _ in sorted_times_with_index]
print(sorted_index)
for i, _ in enumerate(sorted_index):
if i == len(sorted_index) - 1: continue
else: sorted_index[i+1] = sorted_index[i+1] + sorted_index[i]
# print(sorted_index)
# print(sorted_times_with_index, sort_data_list)
with open(res_file_path, 'w+') as file:
for item in del_special_v(sort_data_list, sorted_index):
file.write(item)
file.write("end")
3、结果
运行main.py
脚本后就可以当前目录下看到一个文件名为res.txt
的合并文件,具体内容如下:
date Sunday Mar 11 20:35:00 2024
base hex timestamps absolute
// version 2.1
74099.2804 2 0C0000E4x Rx d 8 71 20 1C 00 FF 00 FF FF
74099.2807 1 00000280x Rx d 8 00 00 15 00 7F 00 37 01
74099.2811 2 0CF00300x Rx d 8 FA FE 00 00 FF FF FF FF
74159.2757 2 18FED900x Rx d 8 00 00 0C 0F 3F 00 0C 01
74159.2763 1 18F00E00x Rx d 8 00 00 00 00 00 00 00 00
74159.2763 2 18F00A00x Rx d 8 FF FF 00 00 FF FF FF FF
74159.2768 1 00000074x Rx d 8 CE 13 00 00 00 00 00 00
74159.2769 2 18FEDF00x Rx d 8 81 FF FF FF 00 00 00 00
74219.2712 1 000001B4x Rx d 8 00 00 00 00 00 00 00 00
74219.2718 1 18EB0000x Rx d 8 00 A0 00 00 00 00 00 A8
74219.2724 1 0C41A800x Rx d 8 00 00 00 00 00 00 00 00
74219.2730 1 0C41A804x Rx d 8 00 00 00 00 00 00 00 00
end
本文所有的工程代码文件可以访问如下网址:https://github.com/Reversev/Tools/tree/master/combine_asc
如果对您有帮助的话,麻烦帮笔者点个星星,谢谢。
三、总结
本博客主要介绍了如何用python根据时间对asc格式报文文件进行合并,方便进行后期的数据读取和整合。实际的CAN/CANFD格式较为复杂,后续有时间再进行详细说明。
四、参考
[1] https://wiki-power.com/%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE-CAN#_5
[2] http://www.bathome.net/thread-68577-1-1.html
[3] https://wiki.csie.ncku.edu.tw/embedded/CAN
作者:IRevers