can总线⽤java怎么解析_CAN报⽂DBC解析的编程⽅法说明主要内容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⽂件来解析报⽂,使报⽂不再仅仅是⼀连串⼗六进制的数,⽽是具有可读性的内容。
java怎么编写接下来我们需要回答以下两个问题我们要做⼀
件什么事情
我们怎么去做这件事情值得注意的是,⽂中提到了在CAN报⽂传输中,编码⽅式的区分(Intel和Motorola),但限于篇幅,并没有这两种⽅式做进⼀步的说明,读者请⾃⾏查阅相关资料。2我们要做⼀件什么事情
2.1 DBC解析在软件框架中的位置
回顾⼀下之前的软件框架DBC解析属于收发报⽂之后的事
情。再回顾⼀下之前在读取报⽂时候所⽤到的流程
我们这⾥需要考虑的问题是在哪个位置解析我们的报⽂,总共有三个位置可以让我们对收到的报⽂进⾏解析,这⾥我们选择在第三个位置,因为在能实现功能的前提下,越靠后改,对整体的影响越⼩。接下来我们要回答的问题是使⽤DBC去解析报⽂究竟是⼀件什么事情,也就是为什么DBC能把报⽂
解析成可读性的内容。
2.2DBC介绍我把DBC解析报⽂的过程当成⼀个映射的过程,也就是这种报⽂表⽰什么意思,已经在DBC⽂件中定义好了。具体⽽⾔,DBC⽂件中定义了⼀系列的规则,收到这个ID就代表是这个报⽂(⽐如ABS类的),这个报⽂包含了什么信号(⽐如ABS的某个传感器状态),数据的第⼏位到第⼏位表⽰这个信号的值。我们根据这些规则来解析报⽂。所以我们接下来要回答的问题是,为了达到解析报⽂的⽬的,⼀个DBC⽂件中究竟有哪些规则。回答这个问题,其实只要把⼏个规则罗列⼀下就好了,这将在最后的时候列举出来。在此之前,我们
先从最后实现的事情⼊⼿,来说明这些规则是起什么作⽤的。
右侧的那些“根据”就是从DBC⽂件解析出来的。为了让读者更进⼀步地了解这个内容。本⽂再以⼀个.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⽂件解析⼗六进制报⽂的⼯作也已经完成了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论