python中使用cantools和can工具包解析blf文件

88 篇文章 6 订阅
58 篇文章 2 订阅

一、工具包安装

pip install cantools python-can

二、解析blf文件

一般情况下,解析blf需要dbc文件,当然其实不用dbc也可以,只不过解析比较麻烦,推荐还是配合dbc解析,这个也是我们最常用的办法。所以要用dbc,需要先加载dbc文件,这里需要cantools,代码:

import cantools
import can
dbc_file = r"C:\Users\master01\Downloads\blf_conf\FS04通用_TBOX(1).dbc"
dbc = cantools.db.load_file(dbc_file)

加载完dbc文件,就可以解析blf文件了,代码

f = r"C:\Users\master01\Downloads\blfdata\问题blf\1.17-9-10.blf"
log_data = can.BLFReader(f)
for msg in log_data:
    print(msg)

打印结果是这样的

Timestamp: 1673917200.026000        ID: 0301    S Rx                DL:  8    1d b0 41 54 07 02 00 00     Channel: 0
Timestamp: 1673917200.026000        ID: 070b    S Rx                DL:  8    00 c8 0c b6 24 b8 24 b8     Channel: 0
Timestamp: 1673917200.028000        ID: 0322    S Rx                DL:  8    00 00 00 00 00 00 03 00     Channel: 0
Timestamp: 1673917200.126000        ID: 030d    S Rx                DL:  8    00 14 00 00 00 00 00 00     Channel: 0
Timestamp: 1673917200.126000        ID: 0320    S Rx                DL:  8    06 b1 00 00 00 00 07 00     Channel: 0
Timestamp: 1673917200.127000        ID: 0708    S Rx                DL:  8    00 48 00 48 00 08 00 32     Channel: 0
Timestamp: 1673917200.129000        ID: 0712    S Rx                DL:  8    00 06 81 0d 21 05 00 00     Channel: 0
Timestamp: 1673917200.271000    ID: 1821a7c1    X Rx                DL:  8    02 2f 00 00 00 00 00 00     Channel: 0
Timestamp: 1673917200.321000        ID: 0110    S Rx                DL:  8    05 36 16 67 00 09 20 6b     Channel: 0
Timestamp: 1673917200.322000        ID: 0111    S Rx                DL:  8    16 5d 00 00 d4 00 20 bf     Channel: 0
Timestamp: 1673917200.322000        ID: 0112    S Rx                DL:  8    49 32 00 10 00 16 6d 4c     Channel: 0
Timestamp: 1673917200.326000        ID: 0300    S Rx                DL:  8    00 3a c2 f8 00 00 00 00     Channel: 0
Timestamp: 1673917200.326000        ID: 0710    S Rx                DL:  8    00 00 00 00 00 00 00 00     Channel: 0
Timestamp: 1673917200.427000        ID: 0709    S Rx                DL:  8    0e 02 0e b0 4a 0c ff fe     Channel: 0
Timestamp: 1673917200.427000        ID: 070a    S Rx                DL:  8    11 51 1f fd 46 de 1c 83     Channel: 0
Timestamp: 1673917200.428000        ID: 0711    S Rx                DL:  8    02 df 00 09 02 d5 00 d4     Channel: 0
Timestamp: 1673917200.438000        ID: 0308    S Rx                DL:  8    03 22 0a 3c 0a 00 00 2a     Channel: 0
Timestamp: 1673917200.550000        ID: 03a1    S Rx                DL:  8    00 00 06 b1 00 00 15 00     Channel: 0
Timestamp: 1673917200.550000        ID: 03a2    S Rx                DL:  8    00 00 00 00 00 00 05 00     Channel: 0
Timestamp: 1673917200.633000        ID: 0270    S Rx                DL:  8    00 67 67 00 00 00 00 a2     Channel: 0
Timestamp: 1673917200.638000        ID: 0307    S Rx                DL:  8    41 14 03 c0 36 00 00 03     Channel: 0
Timestamp: 1673917200.638000        ID: 0309    S Rx                DL:  8    1c 1c 1c 1c 1c 1c c3 50     Channel: 0
Timestamp: 1673917200.655000        ID: 03a0    S Rx                DL:  8    06 b1 00 00 00 00 15 00     Channel: 0
Timestamp: 1673917200.657000        ID: 030a    S Rx                DL:  8    00 00 00 00 00 00 00 00     Channel: 0

可以发现,时间戳解析出来了,其它的数据都是16进制,没法直接看,当然我们如果熟悉blf格式,可以自己把数据还原出来,但是既然已经用第三方库,我们当然就不用自己解析了,而且仔细观察一下即可发现,之前的加载dbc并没有用上,所以这时一个重要的函数登场了,那就是dbc.decode_message(id,data),具体代码如下

decoded = {}
for msg in logdata:
    try:
        dec = dbc.decode_message(msg.arbitration_id, msg.data)
        if dec:
            for key, data in dec.items():
                if key not in decoded:
                    decoded[key] = []
                decoded[key].append([msg.timestamp, data])
    except:
        pass

因为我这里是最后把数据解析出来转成mf4了,所以构建了一个decoded字典,每个key里记一个信号,熟悉mf4的应该知道,mf4里每个信号主要包含两部分,一个是时间戳,一个是数据,有了这两个,我们就可以创建mf4文件了,最后放上创建mf4的代码

from asammdf import MDF,Signal
sigs = []
for k,v in decoded.items():
    timestamps = [i[0] for i in v]
    data = [i[1] for i in v]
    s = Signal(data,timestamps,name=k)
    sigs.append(s)

mdf = MDF()
mdf.append(sigs)
mdf.save("xx.mf4",overwrite=True)

这样就实现了blf文件的解析与转换,当然,转换的格式很自由,只要熟悉相应的格式,比如csv,hdf5,xlsx,json,pickle都可以,因为我们已经拿到原始数据了,保存成什么格式就很简单了。

  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
### 回答1: cantools是一个用于解析和生成CAN数据的工具。要存储BLF文件,请执行以下步骤: 1. 安装cantools使用pip install cantools安装cantools。 2. 导入cantools模块:在代码导入cantools模块。 3. 解析BLF文件使用cantools解析BLF文件。 4. 存储BLF文件使用cantools的write_file函数存储BLF文件。 代码示例: ``` import cantools # 解析BLF文件 db = cantools.db.load_file('example.blf') # 存储BLF文件 cantools.db.write_file(db, 'example_new.blf') ``` ### 回答2: cantools是一个用于处理CAN消息和数据库的Python库。它可以用于解析CAN消息、编码CAN消息、创建、编辑和查询CAN数据库。而BLF文件是一种用于存储CAN消息的二进制格式文件。在使用cantools存储BLF文件时,可以按照以下步骤进行操作: 1. 首先,确保已经安装了cantools库。可以使用pip命令进行安装:pip install cantools。 2. 然后,创建一个cantools数据库对象。可以使用cantools.db.load_file()函数来加载一个CAN数据库文件,例如:db = cantools.database.load_file('example.dbc')。 3. 接下来,打开BLF文件并读取其的CAN消息。可以使用cantools.database.load_blf()函数来加载BLF文件,例如:log = cantools.database.load_blf('example.blf', db.messages)。其,db.messages是从数据库对象获取的CAN消息。 4. 然后,可以根据需要对CAN消息进行处理和分析。通过遍历log对象的消息,可以访问每个CAN消息的ID、数据、时间戳等属性,并执行相应的操作。 5. 最后,可以将处理后的CAN消息保存到一个新的BLF文件。可以使用cantools.database.dump_log_to_blf()函数来将log对象的CAN消息保存为一个BLF文件,例如:cantools.database.dump_log_to_blf('output.blf', log)。 总之,使用cantools存储BLF文件的过程主要包括加载数据库、加载BLF文件、处理CAN消息以及保存处理后的消息到新的BLF文件。通过这些步骤,可以有效地处理和保存CAN消息数据。 ### 回答3: Cantools是一个用于CAN通信数据分析和处理的工具集。在Cantools,可以使用blf文件格式来存储CAN总线数据记录。下面是使用Cantools存储blf文件的步骤: 1. 安装Cantools库:首先,需要安装Cantools库。可以通过pip命令来安装,例如`pip install cantools`。 2. 定义CAN数据库:在使用Cantools存储blf文件之前,需要先定义CAN数据库。CAN数据库描述了CAN总线上使用的消息和信号的结构。可以使用DBC、ARXML或KCD格式的文件来定义CAN数据库。例如,可以创建一个名为"can_database.dbc"的DBC文件来定义CAN数据库。 3. 导入Cantools库和CAN数据库:在Python脚本导入Cantools库,并加载CAN数据库。可以使用`can.Database()`函数来加载CAN数据库文件。例如,可以使用以下代码完成导入和加载操作: ``` import cantools can_db = cantools.database.load_file('can_database.dbc') ``` 4. 创建CAN消息:根据CAN数据库定义的消息结构,可以使用Cantools创建CAN消息。可以使用`can_db.get_message_by_name()`函数按消息名称获取消息定义,然后使用`can.Message()`函数创建一个具体的CAN消息对象。例如,可以使用以下代码创建一个名为“can_message”的CAN消息: ``` can_message = can.Message(arbitration_id=0x123, data=[0x01, 0x02, 0x03], is_extended_id=False) ``` 5. 存储CAN消息为blf文件使用Cantools提供的`cantools.database.can.dump_message()`函数,可以将CAN消息存储为blf文件。该函数接受两个参数:要存储的消息和要存储的文件名。例如,可以使用以下代码将上述创建的CAN消息存储为名为“data_log.blf”的blf文件: ``` cantools.database.can.dump_message(can_message, 'data_log.blf') ``` 通过以上步骤,Cantools库可以被用来将CAN消息存储为blf文件。这样,可以方便地分析和处理CAN总线上的数据记录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羸弱的穷酸书生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值