当前位置: 首页 > news >正文

将can日志数据提取到excle中

一、目标:

读取.blf文件,
提取信号can::HAP_FD1::BrkDistance
并按照20ms的帧率存储到excle中

二、安装python库和依赖

1.所需的库

1)can
2)pandas
3)cantools
4)openpyxl

2.在PyCharm中通过图形界面安装:

1)打开PyCharm
2)点击 File > Settings > Project: [你的项目名] > Python Interpreter
3)点击右上角的 + 按钮
4)搜索 cantools
5)选中后点击 Install Package
6)显示 安装成功 即可。
在这里插入图片描述

三、python编码

1.通过dbc解析blf文件提取数据

import can
import pandas as pd
from can import BLFReader
import cantoolsdef extract_brake_distance_with_dbc(blf_file_path, dbc_file_path, output_excel_path):"""使用DBC文件从BLF中提取刹车距离信号(Motorola格式):param blf_file_path: BLF文件路径:param dbc_file_path: DBC文件路径:param output_excel_path: 输出Excel路径"""# 加载DBC数据库db = cantools.database.load_file(dbc_file_path)data = []previous_timestamp = Nonetry:with BLFReader(blf_file_path) as reader:for msg in reader:# 只处理HAP_FD1报文(假设已知其CAN ID)if msg.arbitration_id == db.get_message_by_name('HAP_FD1').frame_id:# 解码整个报文decoded = db.decode_message(msg.arbitration_id, msg.data)# 20ms采样控制if previous_timestamp is None or (msg.timestamp - previous_timestamp) >= 0.02:data.append({'Timestamp': msg.timestamp,'BrakeDistance': decoded['APS_ESP_BrkDistance']})previous_timestamp = msg.timestamp# 保存到Exceldf = pd.DataFrame(data)df.to_excel(output_excel_path, index=False)print(f"刹车距离数据已保存到 {output_excel_path}")except Exception as e:print(f"处理过程中发生错误: {str(e)}")if __name__ == "__main__":# 文件路径配置input_blf = "test.blf"  # 替换为你的BLF文件dbc_file = "test.dbc"  # 替换为你的DBC文件output_xlsx = "brake_distance.xlsx"extract_brake_distance_with_dbc(input_blf, dbc_file, output_xlsx)

2.通过信号字节序列 提取数据

在这里插入图片描述

信号 BrkDistance 所在报文ID=0x123
BrkDistance信号在报文中位于20、21字节,起始位20字节的0位,字节长度12位
字节序列是motorola格式

import can
import pandas as pd
from can import BLFReader
import cantoolsdef extract_brake_distance_manual(blf_file_path, output_excel_path):data = []previous_timestamp = Nonetry:with BLFReader(blf_file_path) as reader:for msg in reader:if msg.arbitration_id == 0x123:  # 替换为HAP_FD1的实际CAN ID# Motorola格式解析 (起始字节20,位0,长度12)byte20 = msg.data[20]byte21 = msg.data[21]# 合并两个字节并提取12位信号combined = (byte20 << 8) | byte21brake_distance = (combined >> 4) & 0xFFF  # 取12if previous_timestamp is None or (msg.timestamp - previous_timestamp) >= 0.02:data.append({'Timestamp': msg.timestamp,'BrakeDistance': brake_distance})previous_timestamp = msg.timestampdf = pd.DataFrame(data)df.to_excel(output_excel_path, index=False)print(f"数据已保存到 {output_excel_path}")except Exception as e:print(f"发生错误: {str(e)}")

相关文章:

  • 4. Qt对话框(1)
  • C语言Day9:C语言类型转换规则
  • ADVANTEST D3286 Error Detector OPeration Manual 爱德万测试
  • CVE-2017-12629-XXE源码分析与漏洞复现
  • 游戏中的数学计算
  • 从时间到宇宙:探索时间同步的底层奥秘与工程实践
  • javascript中运算符的优先级
  • 【时时三省】(C语言基础)函数的递归调用例题
  • Python中质数筛选及优化效率对比
  • 【笔记】修改abu量化本地部署数据文件夹目录
  • Redis集群热点Key问题解决方案
  • HTML应用指南:利用GET请求获取全国罗森门店位置信息
  • 文本编辑器vi的使用
  • 2025年软件测试面试题,精选33道,附答案
  • 5月28日星期三今日早报简报微语报早读
  • SCDN如何同时保障网站加速与DDoS防御?
  • 【C++基础知识】匿名命名空间
  • 可视化数据大屏适配方案之Scale等比缩放
  • AI日报 - 2025年05月28日
  • 鸿蒙如何引入crypto-js
  • b2b的企业有哪些/seo排名点击
  • 企业培训网/优就业seo
  • 南昌市住房城乡建设委门户网站/项目推广网站
  • 两学一做网站链接/快速开发平台
  • 学做ppt的网站有哪些内容/seo案例分享
  • 做网站一般几个人/网站怎么优化seo