主要内容1. 概述2. 我们要做一件什么事情在软件框架中的位置

DBC介绍3. 我们怎么去做这件事情数据存储

输入输出1概述前面介绍过PEAK的所有CAN卡都有提供如下图所示这些二次开发包,非常适合于做二次开发。PCAN-Basic API除了DLL,也提供了C#, C++/MFC, C++/CLR,C++_Builder, Delphi, VB.NET, Java, and Python等的例程,这些例程里面都有实现硬件初始化,报文收发的功能;我们开发更高级的功能只需要在这个基础上来做开发即可。这篇文章介绍在收到报文之后,我们怎么根据DBC文件来解析报文,使报文不再仅仅是一连串十六进制的数,而是具有可读性的内容。接下来我们需要回答以下两个问题我们要做一件什么事情

我们怎么去做这件事情值得注意的是,文中提到了在CAN报文传输中,编码方式的区分(Intel和Motorola),但限于篇幅,并没有这两种方式做进一步的说明,读者请自行查阅相关资料。2我们要做一件什么事情

2.1 DBC解析在软件框架中的位置

回顾一下之前的软件框架DBC解析属于收发报文之后的事情。再回顾一下之前在读取报文时候所用到的流程我们这里需要考虑的问题是在哪个位置解析我们的报文,总共有三个位置可以让我们对收到的报文进行解析,这里我们选择在第三个位置,因为在能实现功能的前提下,越靠后改,对整体的影响越小。接下来我们要回答的问题是使用DBC去解析报文究竟是一件什么事情,也就是为什么DBC能把报文解析成可读性的内容。

2.2DBC介绍我把DBC解析报文的过程当成一个映射的过程,也就是这种报文表示什么意思,已经在DBC文件中定义好了。具体而言,DBC文件中定义了一系列的规则,收到这个ID就代表是这个报文(比如ABS类的),这个报文包含了什么信号(比如ABS的某个传感器状态),数据的第几位到第几位表示这个信号的值。我们根据这些规则来解析报文。所以我们接下来要回答的问题是,为了达到解析报文的目的,一个DBC文件中究竟有哪些规则。回答这个问题,其实只要把几个规则罗列一下就好了,这将在最后的时候列举出来。在此之前,我们先从最后实现的事情入手,来说明这些规则是起什么作用的。右侧的那些“根据”就是从DBC文件解析出来的。为了让读者更进一步地了解这个内容。本文再以一个.dbc文件为例,来说明我们怎么从DBC文件中获取这些参数。以记事本方式打开一个.dbc文件。首先是一些下图文件头,这个对DBC解析没什么用,读者可自行了解。接下来是一些什么报文包含哪些信号的说明。BO_ 表明这是一个报文,SG_表明这个报文所包含的信号,如果该报文有多个信号,则这里会有多行SG_我们所需要的绝大多数参数来源于这里。后面会继续介绍怎么读懂这些BO_ 和SG_过了BO_ 和SG_之后接下来的BA_跟我们解析并没有多少关系,这里也就不继续介绍。过了BA_之后,到了VAL_,这里是一些枚举型变量,说明了每个数值分别代表什么意思。综上,我们需要关注其实是BO_ ,SG_以及VAL_这些行。我们以各自的实例来说明至此,我们对DBC文件的内容已经有了大概的了解了,这里的了解指的是每个DBC的文件包含了哪些内容,这些内容是怎么对我们的报文解析起作用的。这里再列举如下Ø针对整个报文,有报文ID,报文名称,报文数据长度三个重要参数Ø针对信号,有信号名称,起始位,位长度,编码类型,数据类型,因子和偏移量,最大值最小值,单位等Ø针对枚举型变量,有一系列的键值对3我们怎么去做这件事情

3.1 数据存储有了前面的基础,我们就可以依据前面的流程图对报文进行解析了。再次说明如下1) 读到一个报文,先获取报文ID2) 打开DBC文件,顺序地读取BO_行,发现ID匹配,知道是这个报文3) 读这个报文接下来的SG_行,看看有多少信号,4) 每个信号根据起始位,位长度和编码类型,将十六进制的报文当中的有用的位提取出来5) 根据数据类型进行相应的解码。6) 根据因子和偏移量,将解码的数据再转化成的真实的数据7) 与VAL_行进行对比,如果是枚举型变量,将相应数值转为有意义的字符串8) 加上单位事情到了这里已经很简单了,问题在于,我们不想要每次读一个报文都去打开DBC文件,而是希望把DBC的内容预先储存在程序当中,所以这里我们需要考虑怎么存储这些数据。这其实是数据结构的知识,我们只需要搞清楚从属关系就好了。所谓从属关系,就是哪些参数是谁的。这里其实很直观的,我们有两个主体,一个是报文,一个是信号。信号从属于报文,编码方式等参数从属于信号。所以这里数据储存我们只需要做好以下几件事情:定义一个枚举类,这个类储存枚举型信号的名称和键值对。

定义一个信号类。这个类包含了信号名称,起始位,位长度,编码类型,数据类型,因子和偏移量,最大值最小值,单位。如果是枚举信号,将枚举型信号的键值对也包含进来。

定义一个报文类。这个类包含了报文的ID,报文名称,报文数据长度,以及报文所包含的信号列表。

将报文类构建成一个报文列表。最终的结果就是我们用一个报文列表把DBC文件的内容存储进来,读到报文要做相应解析时,只要比对十六进制报文跟报文列表的内容做相应的解析即可。

3.2 输入输出有了前面的准备,接下来的事情就很顺理成章了。我们再来回顾最开始要做的事情。这里采用逆序思考的方法来看我们怎么做,要做DBC解析,需要先有个已经储存了DBC文件信息的报文列表,要有这个列表,需要预先定义列表所需要的类以及有个DBC文件。然后我们再顺着把事情做一下,把上面的流程图拓展出来。根据这个图,我们可以很明显知道,我们需要做以下四件事情1. 定义好的相关的类这些类的属性和方法根据DBC文件所包含的属性来确定2. 编写一个函数,将给定DBC文件的内容转换成一个报文列表。输入为DBC文件路径,输出为报文列表。

主要涉及的是文件读取内容,每一行的内容代表什么意思。3. 编写一个函数,将指定的报文解析成可读性的内容输入为十六进制的报文和报文列表,输出为可读性的内容

主要涉及的是文件列表中每个参数都有什么作用4. 在相应的位置引用这个函数行文至此,根据DBC文件解析十六进制报文的工作也已经完成了。

can总线用java怎么解析_CAN报文DBC解析的编程方法说明相关推荐

  1. Java开发笔记XML报文的解析

    Java开发笔记XML报文的解析 前言 正文 代码示例 结语 前言 项目任务里需要解析xml报文. 于是开始着手学习相关知识,在查看了多篇博文后找到了一篇不错的,讲的很实用. 转载来源:Java开发笔 ...

  2. can总线用java怎么解析_CAN信号值解析

    本文提供一种可以解析CAN信号各信号值的一种方法并进行说明. 一般情况下,高端一点的设备会计算每一个信号的值,但是接受到CAN信号的报文实际上有各种情况,如何通过设定的起始位和数据长度来获取某一信号的 ...

  3. python解析pcap报文_scapy解析pcap文件

    针对wireshark或者tcpdump捕获的文件,使用python中的scapy库可以非常方便的进行解析,但是也存在一些坑. scapy是一个非常强大的流量包操作工具,可以针对请求或者响应从tcp/ ...

  4. java学习(173):class反射编程方法

    //class反射编程 //定义一个学生类 public class test124 {public String name;protected int age;double height;priva ...

  5. Java解析XML报文内容及标签属性

    前言 JSON格式的报文解析,虽然json串短小精悍,也能有效表达层次结构,但是每个元素只能找到对应的元素值,不能体现更丰富的样式特征.比如某个元素除了要传输它的字符串文本,还想传输该文本的类型.字体 ...

  6. Java学习之SoapUI报文发送和解析

    SoapUI工具测试 1.新建项目 2.编写名称和填写url路径,点击Ok 测试url:http://www.webxml.com.cn/webservices/ChinaTVprogramWebSe ...

  7. JAVA解析xml报文

    目录 问题需求 响应报文格式 1,开发导入的依赖 2,开发样例 3,测试结果 问题需求 在工作中此项目请求指定项目之后,项目会返回一个xml报文格式的响应,此时我需要判断返回的报文是否是成功的响应报文 ...

  8. java 8583报文解析_ISO8583报文工具类(组装和解析报文) | 学步园

    很久没来csdn了.现在的工作地点在银行,妈的,不让上网啊. 写写博客其实是对自己知识的总结,这么长时间了,也该写点东西了.接触银行的项目,避免不了 遇上8583报文.具体介绍就不细讲了,这个网上一大 ...

  9. JAVA实现报文解析:协议的数据类型和完整的报文结构解析

    **JAVA实现GBT32960报文解析系列文章链接:** JAVA实现GBT32960报文解析(一):协议的数据类型和完整的报文结构解析 JAVA实现GBT32960报文解析(二):数据包结构解析源 ...

最新文章

  1. 《压缩感知回顾与展望》读书笔记
  2. idea 自动生成构造以及get、set方法
  3. 计算机组成原理设计一个Isa,计算机组成原理
  4. ubuntu系统配置nijia_在Debian系统中使用backupninja定制备份计划的教程
  5. Ethernet帧和802.3帧区别
  6. Bailian2733 判断闰年【入门】(POJ NOI0104-17)
  7. 计算机常见文件后缀名
  8. 解决报错 Initialize failed: invalid dom.
  9. 图神经网络学习笔记(2)——图滤波器
  10. Map接口及其实现类
  11. 棋牌漏洞游戏反汇编译破解修改透视案例分析
  12. oracle pl/sqp 连接 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
  13. Python基础07
  14. vue项目落地(qiankun.js)微前端服务
  15. 中国三大主流开源Linux操作系统社区及其产品生态
  16. 禁用wordpress5.2自动裁剪图片功能
  17. 前端学习-使用JS库Leaflet.js生成世界地图并获取标注地址经纬度。
  18. 1. 编写函数 cal_numbers:参数为字符串,统计并返回该字符串中的英文字母、空格、数字和其它字符的个数
  19. 开讲啦超级计算机是几季,《开讲啦》第二季成龙:没人能替你奋斗
  20. 检测设备摄像头、指南针、录音、陀…

热门文章

  1. CAD制图初学入门:CAD打印实用技巧
  2. iWatch使用一年综合测评
  3. 推荐产品经理必读书单
  4. linux用ftp上传文件
  5. delta并联机器人/delta机械手工作空间模型相关程序源码
  6. 【好工具】Chrome 浏览器开启视频画中画,看视频敲代码两不误!
  7. java jsp班主任辅导员管理系统
  8. sw运行很卡怎么办_solidworks运行速度慢的原因分析和解决办法
  9. 车牌识别步骤及部分代码
  10. 视频编辑软件‘编辑星V3’中英版本上线了