应用场景

具有CAN总线口的android平板,需要读取CAN传过来的数据。

CAN了解

CAN是ISO国际标准化的串行通信协议,CAN技术规范包含A和B两部分。2.0A给出了曾在CAN技术规范版本1.2中定义的CAN报文格式,能提供11位地址;而2.0B给出了标准的和扩展的两种报文格式,提供29位地址。

CAN2.0B标准帧

CAN 标准帧信息为11个字节,包括两部分:信息和数据部分。前3个字节为信息部分。
Byte1(第一个字节)控制端:数据的字节及保留位的段。
Byte2-3 仲裁段:表示该帧优先级的段(即Message ID)。
Byte4-11 数据段:数据内容,可发送0-8个字节的数据。

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

Byte1

FF

RTR

xx

xx

DLC(数据长度)

Byte2

Message ID

Byte3

Byte4

数据1

Byte5

数据2

Byte6

数据3

Byte7

数据4

Byte8

数据5

Byte9

数据6

Byte10

数据7

Byte11

数据8

字节1为帧信息。第7位(FF)表示帧格式,在标准帧中,FF=0;第6位(RTR)表示帧的类型,RTR=0表示为数据帧,RTR=1表示为远程帧;DLC表示在数据帧时实际的数据长度。

字节2、3为报文识别码,11位有效。
字节4~11为数据帧的实际数据,远程帧时无效。

CAN2.0B扩展帧

CAN 标准帧信息为13个字节,包括两部分:信息和数据部分。前5个字节为信息部分。
Byte1(第一个字节)控制端:数据的字节及保留位的段。
Byte2-3 仲裁段:表示该帧优先级的段(即Message ID)。
Byte4-11 数据段:数据内容,可发送0-8个字节的数据。

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

Byte1

FF

RTR

xx

xx

DLC(数据长度)

Byte2

Message ID

Byte3

Byte4

Byte5

Byte6

数据1

Byte7

数据2

Byte8

数据3

Byte9

数据4

Byte10

数据5

Byte11

数据6

Byte12

数据7

Byte13

数据8

字节1为帧信息。第7位(FF)表示帧格式,在扩展帧中,FF=1;第6位(RTR)表示帧的类型,RTR=0表示为数据帧,RTR=1表示为远程帧;DLC 表示在数据帧时实际的数据长度。

字节2~5为报文识别码,其高29位有效。

字节6~13数据帧的实际数据,远程帧时无效。

3、 CAN读取解析

从输入流获取到字节数组,按图表中字节的含义可以获取到需要的参数信息。
我这里CAN一次读取获取的不只一帧数据,是多条帧掺杂在一起,所以做法是byte数组转成16进制字符串,和CAN协议里的Message ID比对,判断是否包含你要的MessageID,包含则获取他后边的8个字节数据,按照协议文档解析。