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

这篇具有很好参考价值的文章主要介绍了python中使用cantools和can工具包解析blf文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、工具包安装

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都可以,因为我们已经拿到原始数据了,保存成什么格式就很简单了。文章来源地址https://www.toymoban.com/news/detail-505939.html

到了这里,关于python中使用cantools和can工具包解析blf文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IPOP 使用详解 (附IPOP工具包)

    IPOP 是一款设备调试终端工具,功能很强大,集合很多服务、调试、查看手段于一身,主要功能如下: IP 地址动态绑定功能; 路由信息查询和配置功能; MAC 地址信息查询和修改功能; MAC 、主机信息扫描功能; 本机网络报文统计功能; 本机端口列表、远程端口扫描功能;

    2024年02月16日
    浏览(36)
  • 图像处理工具包Pillow的使用分享

    Pillow 是 Python 中一个流行的图像处理库,它是 PIL(Python Imaging Library)的一个友好的分支版本。Pillow 提供了许多功能,使得图像处理变得容易和方便。下面是一些基本用法和示例: 安装 Pillow 首先,你需要安装 Pillow。这可以通过 pip 命令轻松完成: 基本操作 1. 导入图像 2. 显

    2024年01月21日
    浏览(31)
  • Coreutils工具包,Windows下使用Linux命令

    之前总结过两篇有关【如何在Windows系统下使用Linux的常用命令】的文章: GnuWin32,Windows下使用Linux命令 UnxUtils工具包,Windows下使用Linux命令 今天再推荐一个类似的工具包 Coreutils GNU core utilities 是GNU操作系统基本的文件、shell和文本操作实用程序。这些是每个操作系统上都应该

    2024年02月12日
    浏览(29)
  • UnxUtils工具包,Windows下使用Linux命令

    最近写批处理多了,发现Windows下的bat批处理命令,相比Linux的命令,无论是功能还是多样性,真的差太多了。但有时候又不得不使用bat批处理,好在今天发现了一个不错的工具包:UnxUtils,这个工具包包含了将近xx个命令程序,可以在Windows下像使用Linux中的命令一样使用它们,

    2024年02月16日
    浏览(36)
  • 【Java】YAML读写常用工具包及使用示例

    YAML是一种常用的数据序列化格式,在Java应用程序中读写YAML数据是常见的任务。本文介绍了三个受欢迎的Java工具包:SnakeYAML、Jackson Dataformat YAML和YAMLBeans,它们都提供了读写YAML数据的功能。本文将逐一介绍这些工具包的特点、Maven依赖配置,并给出使用示例。最后,本文总结

    2024年02月04日
    浏览(38)
  • 用好Python自然语言工具包-- 实例“基于本地知识库的自动问答”

    首先鸣谢thomas-yanxin 本问中示例来自他在GitHub上的开源项目“基于本地知识库的自动问答”,链接如下: thomas-yanxin/LangChain-ChatGLM-Webui: 基于LangChain和ChatGLM-6B的针对本地知识库的自动问答 (github.com) 目录 1. 基础知识: 2. NLTK库的使用 3. 实例代码分析 设备的定义 函数定义:从网

    2024年02月05日
    浏览(61)
  • 用了这8个 Python 数据挖掘工具包,生产力明显得到了提升!

    在进行数据科学时,可能会浪费大量时间编码并等待计算机运行某些东西。所以我选择了一些 Python 库,可以帮助你节省宝贵的时间。 喜欢记得收藏、关注、点赞,文末送技术交流和资料 Optuna 是一个开源的超参数优化框架,它可以自动为机器学习模型找到最佳超参数。 最基

    2024年02月01日
    浏览(47)
  • Python mpl_toolkits.mplot3d工具包绘制三维图

    在Python中我们可以导入 mplot3d 工具包来绘制三维图。 在 Matplotlib 1.0.0 之前,每个图形只能创建一个 Axes3D ,需要被直接定义为 ax = Axes3D 在 Matplotlib 3.2.0 之前,必须导入 mpl_toolkits.mplot3d 模块将 Projection=\\\'3d\\\' 传递给 Figure.add_subplot 3维坐标系通过将 Projection=\\\'3d\\\' 传递给

    2024年02月12日
    浏览(49)
  • 基因表达差异分析R工具包DESeq2的详细使用方法和使用案例

    DESeq2是一种常用的差异表达基因分析工具,可用于RNA-seq数据的差异表达分析。下面是DESeq2的详细使用步骤和全部脚本示例。 文章参考 Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2 | Genome Biology | Full Text (biomedcentral.com) bioconda源对工具包的介绍: Bioconductor - DES

    2024年04月15日
    浏览(35)
  • JAVA深化篇_26——Apache commons-io工具包的使用

    Apache基金会介绍 Apache软件基金会(也就是Apache Software Foundation,简称为ASF),是专门为支持开源软件项目而办的一个非盈利性组织。在它所支持的Apache项目与子项目中,所发行的软件产品都遵循Apache许可证(Apache License)。 官方网址为:www.apache.org 。 很多著名的Java开源项目

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包