Python 如何解析或解码CAN总线日志文件中的十六进制数据?

Python 如何解析或解码CAN总线日志文件中的十六进制数据?,python,csv,Python,Csv,我想知道如何解析/解码CAN-LOG文件中的十六进制数据。(这是一个csv文件) 该文件来自CAN(控制器局域网)总线,该总线将用于汽车中不同ECU之间的通信 我想解码此日志文件中的以下数据字节(以下列中的数据): 我想知道是否有关于此CAN总线数据的特定解析器 ID、D1、D2、D3、D4、D5、D6、D7、D8(所有这些列都有十六进制格式的数据) 例如: TYPE,TIME,ID,D1,D2,D3,D4,D5,D6,D7,D8,ASCII,COUNT,PERIOD,, RD11,4.2386

我想知道如何解析/解码CAN-LOG文件中的十六进制数据。(这是一个csv文件)

该文件来自CAN(控制器局域网)总线,该总线将用于汽车中不同ECU之间的通信

我想解码此日志文件中的以下数据字节(以下列中的数据):

我想知道是否有关于此CAN总线数据的特定解析器

ID、D1、D2、D3、D4、D5、D6、D7、D8(所有这些列都有十六进制格式的数据)

例如:

TYPE,TIME,ID,D1,D2,D3,D4,D5,D6,D7,D8,ASCII,COUNT,PERIOD,,
RD11,4.2386,424,3,0,C,0,0,16,1,FF,        ,107,0.0397,,
RD11,4.2394,375,F,F,0,0,0,0,0,0,        ,43,0.1,,
RD11,4.2396,236,10,BD,F,FF,20,0,0,8C,        ,424,0.01,,
我尝试过这个功能:

bytes.fromhex('30C00161FF').decode('utf-8')
也尝试了这个功能

binascii.unhexlify('1C3C00FFFFFFFF')
但我无法提取温度、速度、加速度等参数

ID列具有名称“温度”、“速度”,D1到D8列具有与这些参数相关的值

希望这有助于:

def parse_line(line):
    spl = line.split(',')
    return (spl[0], float(spl[1]), int('0x'+spl[2],0), int('0x'+spl[3],0), int('0x'+spl[4],0), int('0x'+spl[5],0), int('0x'+spl[6],0), int('0x'+spl[7],0), int('0x'+spl[8],0), int('0x'+spl[9],0), int('0x'+spl[10],0), spl[11], int(spl[12]), float(spl[13]))
可以像这样使用:

line1="RD11,4.2386,424,3,0,C,0,0,16,1,FF,        ,107,0.0397,,"
line2="RD11,4.2394,375,F,F,0,0,0,0,0,0,        ,43,0.1,,"
line3="RD11,4.2396,236,10,BD,F,FF,20,0,0,8C,        ,424,0.01,,"
print parse_line(line2)
print parse_line(line3)
print parse_line(line4)
和产出

('RD11',4.23861060,3,0,12,0,0,22,1255',107,0.0397)
('RD11',4.2394885,15,15,0,0,0,0,0,0',43,0.1)
('RD11',4.2396566,16189,15255,32,0,0140',424,0.01)


你的CAN数据看起来很奇怪。我更习惯于CANDump或CANvas数据,这通常类似于
18fedf00;7da0287d7dfffff0
:后跟数据本身的SPN/PGN。SPN将告诉您如何解码数据,具体取决于制造商和年份

例如,您的第三个数据点可能是SPN 236,“发动机总怠速燃油使用量”?但我不知道424和375是什么,所以也许我读错了你的数据

不久前,我编写了此工具,用于处理少量通用CAN数据:

这可能对你有帮助。
Brett

int('0x'+变量,0)是十六进制转换的一个很好的候选者。谢谢!我认为这必须有助于恢复一旦执行。没有完全得到评论。但是如果我的帖子回答了你的问题,请毫不犹豫地接受答案。再见,它没有达到我预期的目的。感谢您的帮助。您可以编辑您的问题以使其更清楚,因为我不明白它如何不回答您的问题。您的解决方案将完成从十六进制转换为整数的工作。但由于我不熟悉读取CAN总线数据,但要知道哪个ID属于哪个参数,必须通过实验进行实时检查,我们将得到值,但不会知道哪些位是针对哪个参数变化的,以及变化基于什么逻辑。在将十六进制转换为int时,您的解决方案没有任何错误。因此,这不是我所期望的解决方案。这个CAN数据不能解码任何东西。这是一个乏味的过程。非常感谢。