【CAN】asc报文格式文件合并(python版)

目录

  • 一、简介
  • 二、合并asc格式报文
  • 1、准备多个asc文件
  • 2、根据时间合并asc文件
  • 3、结果
  • 三、总结
  • 四、参考
  • 一、简介

  • CAN通信:CAN(Controller Area Network)是一种多主方式的串行通讯总线。基本设计规范要求有高位速率高抗电磁干扰性,而且能够检测出产生的任何错误,当信号传输距离达到 10Km 时 CAN-bus 仍可提供高达 5Kbps 的数据传输速率。CAN通信是一种有线通信方式,CAN/CANFD由于其可靠性和高速率,在车辆通信领域应用广泛。
  •   CAN通讯可以有多个从机或主机节点,分别具有CAN接收和发送功能,它们将信号发送到总线,同时也从总线上接收其他节点的信号,信号的传输方式分别是CANH(高电平)CANL(低电平),具体信息流图如下所示:

  • asc报文格式内容分别:Header、版本编号、报文内容(含接收和发送,CAN和CANFD)和结束标志行。
  •   详细内容可以看这个博文: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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【CAN】asc报文格式文件合并(python版)

    发表回复