can整车报文解析

 

 

 

 

 

 

 

 

 

设置初始化,配置管脚,是否进行映射,配置波特率,设置中断函数等等。

 

下面详细介绍如何解析整车报文的详细过程

 

 

Can1控制器发,Can2控制器接收。发送比较简单,设置好发送函数,配置一下ID就完事了,接收也同样简单,只需滤波一下需要的ID就行。但是如果是整车报文的解析就不一样了。主要是接收方的解析。

   首先我们得到要解析的报文的ID,通过过滤器筛选出自己想要的ID,保存在fifo里面,由于fifo空间有限,我们需要及时的读取出来,但是由于需要进行判断报文的作用,这个过程很漫长,但系统不希望在中断里面进行一些运算,因此采用缓存数组,将fifo里面的报文读取出来。Fifo里面只要有报文,中断标志位就触发,及时读取。这里举例,如何设置报文过滤,这也是我困惑的地方。

   

 

例如我们移植需要接收ID为0x90(标准格式的ID共11位)。这个时候我们设置过滤器,   一般我们都采用标准帧格式。那么过滤器是32位的就相当于可以拆分开来等于两个ID。比如0x00900030使我们想要的ID报文,那么其实就是两个0x0090,0x0030。

我们只要设置CANFILTERID=0X00900030,CANFILTERMASKID=0XFFFFFFFF然后这两个寄存器分别分为高位和低位,这时只要进行移位和与处理就可以分别提取出来0x90和0x30。然后进行在进行移位提取11位,最后保存,因为是左对齐,后面补0不影响(我困惑的地方)。

CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit; //16位

CAN_FilterInitStructure.CAN_FilterIdHigh = (ID>>16)<<5;

CAN_FilterInitStructure.CAN_FilterIdLow = (ID&0xFFFF)<<5;

CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (MaskID>>16)<<5;

CAN_FilterInitStructure.CAN_FilterMaskIdLow = (MaskID&0xFFFF)<<5

 

 

报文解ID读取出来之后,需要解析是什么报文,有可能是解析报文,也有可能是只能诊断报文和网络管理报文。然后分别保存在各自分配的队列里。然后在根据ID分配在不同的ID下的缓存里面。好处是防止在中断里进行处理,系统出错。然后在解析的时候提取出来。

解析出来的信息分为开关量和数字量。一个报文里面有很多信息,对照起始byte和bite以及long得到自己想要的数据信息。然后赋值给一些tag,当然中间要进行一些处理,比如开关量过滤,防止偶然或者时间上的错误。