博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python拆分CANLog
阅读量:5035 次
发布时间:2019-06-12

本文共 3736 字,大约阅读时间需要 12 分钟。

通过CANOE 导出的log通常有很多个ID的数据,如何才能找到某一个ID下的特殊的信号?利用python可以简单的进行这个步骤,代码如下:

说明:

  最终的效果是将log信息,分不同的ID进行拆分,并单独生成文件log_id.csv的文件夹。

  1. 需要输入输入文件夹

  2. 生成_out文件夹。

  3. 没有错误处理

  4. 采用"[A-F|\d]{3}"匹配CAN ID

1 #log analy about CAN Signal for CANOE 2 import os 3 import re 4  5 ID_Info = {} 6 fold_in = input("Please input Folder In:") 7 fold_out = fold_in + "_out" 8 os.mkdir(fold_out) 9 rep_id = r"[A-F|\d]{3}"10 patt_id = re.compile(rep_id)11 def Info_Report():12   '''13   CAN Log中的信息有固定的位数。14     0:时间戳15     1:1/216     2:ID17     3:Rx/Tx18     4: d19     5: data Length20     6: data length number info21   '''22   pass23 24 def Dev_Folder(folder_in):25   for fi in os.listdir(folder_in):26     #打开文件27     with open(os.path.join(folder_in,fi),"r") as file:28       #遍历文件行29       for line in file:30         #拆分文件,去掉空格,去掉前后逗号31         a = re.sub('\s+',',',line).strip(",")32         #判断List是否有3个以上的元素,并且第3个是否为ID.33         if len(a.split(",")) > 2 and patt_id.match(a.split(",")[2]):34           if a.split(",")[2] in ID_Info.keys():35             #如果在字典中,直接将信息写入到该文件中36             pass37           else:38           #新建一个文件,关联字典39             ID_Info[a.split(",")[2]] = open((os.path.join(fold_out + "\\" + "Log_" + a.split(",")[2]) + ".csv"),"w")40           ID_Info[a.split(",")[2]].write(a+"\n")41           #print(a.split(",")[0])42   for key in ID_Info:43     ID_Info[key].close()44 45 if __name__ == '__main__':46   Dev_Folder(fold_in)47

 以上拆分为单个的ID了,那么如何找到某一个信号的值呢?可以通过下面的代码进行计算:

1 ''' 2 CANOE Log 3 ''' 4 ''' 5  6 ''' 7 start_bit = 0 8 data_length = 0 9 can_mode = 010 11 def Info_Report():12   '''13   Need Input This information about CAN setting.14   start bit: start_bit15   Length   : Data_Length16   start bit mode : LSB(0)/MSB(1)17   default:LSB(0)18   '''19   pass20 21 def SetBit(start,length,mode = 0):22   '''23   for Get Info or set info24   '''25   start_bit = start26   data_length = length27   can_mode = mode28 29 def Analyse_ID_File(File_Input_Name,File_Output_Name):30   '''31   Analyse id for Every ID Signal32   '''33   #open file34   file_out = open(File_Output_Name,"w")35   with open(File_Input_Name,"r") as file:36     for line in file:37       #拆分每一行,放入到list中38       data_list = line.split(",")39       data_length = int(data_list[5],16)40       list_in = data_list[6:6+data_length]41       data_signal = Find_FromList(list_in)42       file_out.write(data_list[0]+","+str(data_signal)+"\n")43   file_out.close()44 45 def Find_FromList(data_list):46   dataMerge = ''47   a,b,c = Find_StartEnd(start_bit,data_length,can_mode)48   #print(data_list)49   if len(data_list) > b:50     for i in range(a,b+1):51       #print(i)52       dataMerge = dataMerge + data_list[i]53       #print(dataMerge)54     data_Digit = (int(dataMerge,16)>>c) & ((1<<(data_length))-1)55     return (data_Digit)56     #print(dataMerge)57 58 def Find_StartEnd(start,length,mode):59   '''60   This Function return value:61   byte_little,byte_big,bigbyte_bit62   '''63   startbyte = start >> 364   startbit = start % 865   if mode == 0:66     litByte = startbyte - ((startbit+length-1)>>3)67     BigByte = startbyte68     Endbit = startbit69   else:70     pass71   return (litByte,BigByte,Endbit)72 73 if __name__ == '__main__':74   #print(Find_StartEnd(32,20,1))75   file_name = input("Please input file You need Analyse:")76   file_out_name = input("Please input file You need Out(.csv):")77   start_bit,data_length,can_mode = map(int,input("please input can info(start_bit,data_length,can_mode(0/1),PV为0):").split(","))78   Analyse_ID_File(file_name,file_out_name)

以上,如果不通过导入每个信号信息含义的话,是可以快速的找到某个信号在整个log中的值得变化的。

  以上,只支持以LSB开始,计算长度的算法。如果以MSB需要在''Find_StartEnd"函数中增加''mode == 1''的处理。

转载于:https://www.cnblogs.com/ply616/p/6180840.html

你可能感兴趣的文章
Django配置
查看>>
创建快捷方式
查看>>
js执行多次事件,而非一次
查看>>
转载:Android中的数据库操作
查看>>
BZOJ1237: [SCOI2008]配对
查看>>
pytho logging
查看>>
清除浮动的简要介绍
查看>>
postprocessing-brightness-contrast-hue-saturation-vibrance
查看>>
var_dump 和 echo 和print_r 的区别是什么?
查看>>
限制input text输入的类型(数字,字母,小数点)
查看>>
protected访问修饰符
查看>>
Routing 为 Magento 2 一个重要的部分,本文介绍基本应用
查看>>
什么是logger?
查看>>
基于FPGA与DSP协同处理PAL制_CameraLink_SDI高清视频图像传输卡
查看>>
一个Java程序员应该掌握的10项技能
查看>>
c#英文大小写快捷键
查看>>
tpframe免费开源框架又一重大更新
查看>>
一.go语言 struct json相互转换
查看>>
什么是架构设计
查看>>
程序员学习能力提升三要素
查看>>