金牌会员
 
- 积分
- 1870
- 金钱
- 1870
- 注册时间
- 2011-9-16
- 在线时间
- 419 小时
|
发表于 2016-8-26 17:24:20
|
显示全部楼层
4.3.3 10BCRC 校验 (校验和)
CRC 校验从“从站地址”开始,至“最后一个数据内容”结束。CRC 校验计算方法如下:
步骤 1:载入一个内容值为FFFF(十六进制)的16 位寄存器(称为CRC 寄存器)。
步骤 2:指令讯息中的第一个字节的8 位数据与CRC 寄存器低字节的8 位数据进行异或运算,运算
结果存储于CRC 寄存器内。
步骤 3: CRC 寄存器的内容值右移1 位并将其最高位填入0。
步骤 4: 检查 CRC 寄存器最低位的值,如果为0 则重复步骤3;如果为1,CRC 寄存器的内容与
A001(十六进制)进行异或运算,运算结果存储于CRC 寄存器内。
步骤 5:重复步骤3 及步骤4,直到CRC 寄存器的内容被右移了8 位。此时,指令讯息的第一个字节
已完成处理。
步骤 6:对指令讯息的下一个字节重复步骤2 至步骤5 的操作,直到指令讯息的所有字节都被处理完
成。CRC 寄存器最后的内容就是CRC 校验值。在指令讯息中传送CRC 校验值时,计算出的CRC 校
验值高低字节须互换,即CRC 校验值低字节先被传送。
下面为用C 语言求CRC 校验值的计算范例
unsigned char* data 􀃅 // 指令讯息内容指针
unsigned char length 􀃅 // 指令讯息的长度
unsigned int crc_chk(unsigned char* data, unsigned char length)
{
int j;
unsigned int reg_crc=0Xffff;
while(length--)
{
reg_crc ^= *data++;
for (j=0;j<8;j++)
{
If (reg_crc & 0x01) reg_crc=(reg_crc>>1) ^ 0Xa001; /* LSB(b0)=1 */
else reg_crc=reg_crc >>1;
}
}
return reg_crc; // the value that sent back to the CRC register finally
}
|
|