程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用cantools从.asc文件正确读取J1939消息?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使用cantools从.asc文件正确读取J1939消息??

开发过程中遇到如何使用cantools从.asc文件正确读取J1939消息?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用cantools从.asc文件正确读取J1939消息?的解决方法建议,希望对你解决如何使用cantools从.asc文件正确读取J1939消息?有所启发或帮助;

我正在尝试创建一个从 .asc 文件到 .csv 文件(以人类可读的形式)的 CAN 日志转换器。我有点成功。我的代码几乎适用于除 j1939.dbc 之外的所有数据库。

问题是,如果我打印出从 dbc 文件读取的消息,我可以看到来自 j1939.dbc 的消息被读入数据库。但它无法在已处理的日志文件中找到任何这些消息。同时,我可以使用 Vector canalyzer 读取同一个文件,没有任何问题。

我想知道为什么会发生这种情况以及为什么它只影响 j1939.dbc 而不是其他。

我怀疑我转换这些消息的方式可能是错误的,因为它从不经过 if msg_ID in database: 行(如上所述,这些消息肯定存在,因为 Vector canalyzer 与它们配合得很好)。

编辑:我意识到问题可能不在于 cantools 而是 python-can 包,也许 can.ASCReader() 对 j1939 框架效果不佳并忽略了它们?我要自我调查,但我希望更擅长编码的人会有所帮助。

import pandas as pd
import can
import cantools
import time as t
from tqdm import tqdm
import re
import os
from binascii import unhexlify


dbcs = [filename.split('.')[0] for filename in os.Listdir('./dbc/') if filename.endswith('.dbc')]
files = [filename.split('.')[0] for filename in os.Listdir('./asc/') if filename.endswith('.asc')]
start = t.time() 

db = cantools.database.Database()

for dbc in dbcs:
    with open(f'./dbc/{dbc}.dbc','r') as f:
        db.add_dbc(f)


f_num = 1

for fname in files:
    print(f'[{f_num}/{len(files)}] Parsing data from file: {fnamE}')    
    log=can.ASCReader(f'./asc/{fnamE}.asc')
    entrIEs = []
    all_R_312_11845@sgs =[]


    message = {'Time [s]': ''}
    database = List(db._frame_ID_to_message.keys())
    print(databasE)
    lines = sum(1 for line in open(f'./asc/{fnamE}.asc'))
    msgs = iter(log)

    try:
        for msg,i in zip(msgs,tqdm(range(lines))):

            msg = re.split("\\s+",str(msg))
            timestamp = round(float(msg[1]),0)
            msg_ID = int(msg[3],16)

            try:
                data = unhexlify(''.join(msg[7:15]))
            except:
                conTinue

            if msg_ID in database:
                if timestamp != message['Time [s]']:
                    entrIEs.append(message.copy())
                    message.update({'Time [s]': timestamp})
                message.update(db.decode_message(msg_ID,data))

    except ValueError:
        print('ValueError')
        
    df = pd.DataFrame(entrIEs[1:])
    duration = t.time() - start
    df.to_csv(f'./csv/{fnamE}.csv',index=falsE)
    print(f'DONE IN {int(round(duration,2)//60)}min{round(duration % 60,2)}s!\n{len(df.columns)} signals extracted!')
    f_num += 1

解决方法

class can.ASCReader(file,base='hex') 基础: can.io.generic.baseIOHandler 来自 ASC 日志文件的 CAN 消息迭代器。元数据(评论、总线统计、J1939 传输 协议消息)被忽略。 可能会回答你的问题...

大佬总结

以上是大佬教程为你收集整理的如何使用cantools从.asc文件正确读取J1939消息?全部内容,希望文章能够帮你解决如何使用cantools从.asc文件正确读取J1939消息?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: