python解析can报文_解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真
通常我们拿到某个ECU的通信矩阵数据库文件,.dbc后缀名的文件。 直接使用CANdb++ Editor打开,可以很直观的读懂信号矩阵的信息,例如下图:
现在要把上图呈现的信号从.dbc文件中解析出来,供实现自动化仿真总线信号使用,比如使用python+支持can收发的硬件即可替代canoe实现信号仿真(性能上不够用,可满足功能测试所需)。
一个标准CAN帧中包含的信息有,消息ID、报文发送周期、 报文长度、信号信息等。
开始解析前,先了解一下报文帧。下表体现了摩托罗拉字节位序的报文发送时的字节序和bit序,一会儿可以帮助我们理解dbc中的定义
我使用了notepad++打开数据库文件,提取数据库文件中的关键信息。此处随意选取了其中一个ID=1015(dec)作为例子讲解。全文本搜索1015,结果如下:
Line 62: BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX
Line 883: CM_ BO_ 1015 "Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption";
Line 884: CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";
Line 1265: BA_ "GenMsgCycleTime" BO_ 1015 1000;
Line 1463: BA_ "GenSigStartValue" SG_ 1015 IPK_EVDTEodometer 4095;
Line 1967: VAL_ 1015 IPK_EVDTEodometer 4095 "Invalid" ;
挨个戳开每条搜索结果查看详细内容,逐句解释:
说明:dbc文件以空格符拆分数据信息,类似于csv文件以","拆分数据的意思," "属于分隔符。还有其他分割信息的符号,如 "|",",","()","[]"等
1、报文消息数据格式解读
举例:以下是DBC中代表一条消息的描述信息
BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX
解释:
BO_ 代表一条消息的起始标识
1015 消息ID的十进制形式,=0x3f7
IPK_ODO_Consump 消息名
: 分割符号
8 消息报文长度,帧字节数
Vector__XXX 发出该消息的网络节点,标识为Vector__XXX时未指明具体节点
2、信号信息数据格式解读
每条报文消息里面有多个报文信号,报文信号的信息的起始标识为"SG_", 它以一个"BO_"开始至下一"BO_"之间的内容止,详细报文消息以缩进1或2个空格符形式类似树图子节点的方式呈现。
举例:一条消息下的一个信号的信息,此处缩进一个空格
SG_ IPK_EVDTEodometer : 7|12@0+ (1,0) [0|999] "km" TBOX
解释:
SG_ 代表一个信号信息的起始标识
IPK_EVDTEodometer 信号名,分长名与短名,此处是短名。长名非必须存在,可以不定义
: 分割符号
7 信号起始bit
| 分割符号
12 信号总长度
@0+ @0表示是Motorola格式(Intel格式是1),+表示是无符号数据
(1,0) (精度值,偏移值)
[0|999] [最小值|最大值], 物理意义的最小与最大,现实世界的有物理意义的值,比如此处仪表续航里程最大999KM
"km" "单位"
TBOX 接收处理此信号的节点,同样可以不指明,写为Vector__XXX
1)Motorola格式与Intel格式
这个决定了信号起始bit, 生成报文计算信号值时的大小端算法。
Motorola格式:
信号以高字节低位起始,此处占了12bit, 以第二字节的低bit 12位算起,计12个bit总长度,信号是连续的(此处连续针对低字节在前的字节发送序,参看LSB与MSB)。
比如我设置续航里程998KM, 它的信号值在整条报文中表现为3E,60,00,00,00,00,00,00
发送字节序
信号布局图 (横轴bit序,纵轴字节序;先从左至右,再由上至下阅读信号)
Intel格式:
信号以低字节低位起始,此处占了12bit, 以第一字节的低bit 0位算起,计12个bit总长度,信号是非连续的(发送的字节序体现出的信号值非连续,但是bit位是由低到高连续的)。
比如我设置续航里程998KM, 信号值在报文中为E6,03,00,00,00,00,00,00
信号布局图(横轴bit序,纵轴字节序;先从右至左,再由上至下阅读信号)
2)精度值与偏移量,物理值与信号值的关系公式:
信号值*精度值 + 偏移量 = 物理值
总线上报文消息中传递的是信号值,当此信号传递到ECU时,需转换为物理意义的值在输出接口显示。
举例:
SG_ TCU_TransOilTemp : 7|8@0+ (1,-40) [-40|214] "°C" TBOX
若传感器显示16度,则 信号值=(物理值-偏移量)/精度值 = (16 - (-40))/1 = 56(dec) = 0x38, 报文呈现为“38,00,00,00,00,00,00,00” (此处00表示未设置信号,","分割字节,以上同)
3、消息与信号的详细描述
CM_ BO_ 1015 "Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption";
CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";
解释:
CM_ 起始标识,我猜测CM_为comment缩写
4、消息发送周期
BA_ "GenMsgCycleTime" BO_ 1015 1000;
解释:
BA_ 起始标识,描述消息与信号更详尽的信息。 以上语句描述了消息的周期,单位ms
5、信号默认值,起始值
BA_ "GenSigStartValue" SG_ 1015 IPK_EVDTEodometer 4095;
解释:
BA_ 起始标识,描述消息与信号更详尽的信息。 以上语句描述了消息中具体信号的初始值,十进制表示
6、值枚举或特殊值列举或取值范围描述
VAL_ 1015 IPK_EVDTEodometer 4095 "Invalid" ;
解释:
VAL_ 起始标识符,对信号值的描述
以上是DBC解析的的完整内容,转载注明出处。
python解析can报文_解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真相关推荐
- 解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真
通常我们拿到某个ECU的通信矩阵数据库文件,.dbc后缀名的文件. 直接使用CANdb++ Editor打开,可以很直观的读懂信号矩阵的信息,例如下图: 现在要把上图呈现的信号从.dbc文件中解析出来 ...
- c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?
最近想做一个SQL语句解析器,换句话说想给自己的系统加上类似SQL语句的查询引擎.我之前做过一个解析类似C语言语法的解析器,可以解析 C/C++里的运算表达式,if-else-等基本语句.我以为做个S ...
- python解析pcap报文_scapy解析pcap文件
针对wireshark或者tcpdump捕获的文件,使用python中的scapy库可以非常方便的进行解析,但是也存在一些坑. scapy是一个非常强大的流量包操作工具,可以针对请求或者响应从tcp/ ...
- Python解析GPGGA报文_统计数据完整率
相信很多人在拿到一款新的GNSS接收机的时候,都在想如何评估这个设备的性能.评估GNSS设备性能的方法很多,如统计GGA的固定率.数据完整率.连续运行时间的稳定性等等. 下面我们就从数据的完整率来入手 ...
- python 支付宝个人账单_解析2018年度三大用户数据报告——网易云音乐、支付宝、微信...
文章分别给大家简单的解析一下2018年度网易云音乐.支付宝.微信的用户数据报告. 继网易云音乐.支付宝相继发布2018年用户数据报告后,微信也悄悄发布自己的数据报告,截止目前大家期待的三大产品数据报告 ...
- python药店销售数据分析_解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时 ...
- Java解析银联报文_中国银联8583报文(JAVA)封包/解包/位图 相关操作源代码
一:IS08583包介绍: ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分. 8583包前面一段为位图,用来确定包的字段域 ...
- python药店销售数据分析_解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现...
Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业 ...
- python语法详解_解析 Python3 基础语法
行与缩进 python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} . 缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数.实例如下: if True: print ( ...
- Java解析银联报文_银联ISO8583报文解析过程
主密钥: aabbccddeeff11223344556677889900 1.从签到报文中获取工作密钥,包括MACKEY明文,PINKEY明文 签到: 12-03-31 16:38:09----&g ...
最新文章
- libcurl下载限速编程调研
- 解决javah生成c头文件时找不到android类库的问题
- 计算机网络第六章:应用层
- 【Python相关】jupyter平台最强插件没有之一
- Java性能调优调查结果(第二部分)
- 魔术方法 python_python所有的魔术方法
- oracle地址已被占用,ORA-12542 TNS 地址已被占用
- Spark吐血整理,学习与面试收藏这篇就够了!
- Android 设备管理器和有权查看使用情况的应用详解
- 追忆那似水流年的产品梦
- Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫
- 赵雅智:android教学大纲
- 在职场如何应对他人的关注
- NETCONF配置CISCO XE(csr1000v)初体验
- freemarker中的split字符串分割
- ABB AC500 - Programmable Logic Controllers PLCs可编程逻辑控制器
- libIEC61850学习记录
- 湖北武汉资料员培训资料员在建筑工程中的作用建筑七大员培训
- python制作文字识别_用Python轻松进行图像文本识别
- 吃了这个开源小玩意让单片机开发和Arduino一样高效