数据字段由一个数据帧里被传输的数据组成。它可以包含0到8个字节,每个包含8位,首先发送MSB。CRC字段
包含CRC序列,其次是一个CRC分界符。CRC字段结构如图2.5所示。
图2.5 CRC字段的结构 CRC序列
帧校验序列推导出位计数小于127位最适合帧的循环冗余代码(BCH码)。为了进行CRC计算,多项式除以0被定义为有15个最低系数的多项式,其中系数由包括帧头,仲裁字段,控制字段,数据字段(如果存在)的destuffed位流确定。多项式(系数计算模2)除以发生器多项式:
这个多项式除法的余数是在总线上传输的CRC序列。为了实现这个功能,可以用15位的移位寄存器CRC_RG(14:0)。如果NXTBIT表示比特流的下位,由从帧开始直到数据字段的尾部的destuffed位序列来确定,CRC序列的计算方法如下:
CRC_RG = 0; // initialize shift register
REPEAT
CRCNXT = NXTBIT EXOR CRC_RG(14);
CRC_RG(14:1) = CRC_RG(13:0); // shift left by
CRC_RG(0) = 0; // 1 position
IF CRCNXT THEN
CRC_RG(14:0) = CRC_RG(14:0) EXOR (4599hex);
ENDIF
UNTIL (CRC SEQUENCE starts or there is an ERROR condition)
传输/接收的最后一个比特的数据字段后,CRC_RG包含CRC序列。
CRC分界符
其次是由一个单一的“隐性”位组成CRC分界符CRC序列。
应答字段
应答字段长度为两位,包含应答槽和应答分界符。应答字段的结构如图2.6所示。
在应答字段发送器发送两个“隐性”位。
一个接收器正确地收到了有效的信息,在应答槽发送一个“显性”位来报告给发送器(发送“确认”)。
图2.6 应答字段的结构
应答槽
当所有接收站已接收到匹配的CRC序列时,通过在应答槽写“显性”位到发送器的“隐形”位来报告。
应答分界符
应答分界符是应答字段的第二位,是“隐性”位。因此,在应答槽的前后是两个“隐性”位(CRC分界符,应答分界符)。
帧尾
每个数据帧和远程帧都由一个含有7个“隐性”位的标志序列来分隔[15]。
2.2.2 接收器发送器的定义
发送
一个单位发送一条消息,叫做这条信息的发送器。单位保持发送器状态,直到总线空闲或单位失去仲裁。
接收
一个单位如果不是那条信息的发送器同时总线不处于空闲状态时,这个单位被称为信息的接收器[15]。
2.3 本章小结
本章主要介绍了德国BOSCH公司的CAN技术规范,着重介绍了当中对数据帧结构的定义这一部分,而作者在进行CAN总线网络协议分析的过程中主要也是用到了数据帧结构的定义。
3 使用的软硬件介绍
3.1 VC6.0环境下的mfc编程
MFC是微软基础类库的简称,是微软公司实现的一个C++类库,主要封装了大部分的Windows API函数,VC++是微软公司开发的C/C++的集成开发环境,所谓集成开发环境,就是用户可以利用它来编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。有时人们所说的VC也指它的内部编译器,集成开发环境必须有一个编译器内核,,例如DevC++其中一个编译器内核就是gcc。 MFC除了是一个类库以外,还是一个框架,在VC++里新建一个MFC的工程,开发环境会自动帮助用户产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了MFC内核,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率,但是MFC的封装很浅,所以效率上损失不大,灵活性还比较好,虽然也有很多缺陷,但还是一个比较好的产品。 CAN总线网络协议分析+文献综述(4):http://www.youerw.com/tongxin/lunwen_9287.html