《Modbus协议中CRC校验和LRC校验》由会员分享,可在线阅读,更多相关《Modbus协议中CRC校验和LRC校验(6页珍藏版)》请在金锄头文库上搜索。
1、 .CRC 的生成循环冗余校验(CRC) 域为两个字节,包含一个二进制16 位值。附加在报文后面的CRC 的值由发送设备计算。接收设备在接收报文时重计算CRC 的值,并将计算结果于实际接收到的CRC值相比较。假设两个值不相等,则为错误。CRC 的计算, 开头对一个16位存放器预装全1. 然后将报文中的连续的8位子节对其进展后续的计算。只有字符中的8个数据位参与生成CRC 的运算,起始位,停顿位和校验位不参与CRC 计算。CRC 的生成过程中, 每个 8位字符与存放器中的值异或。然后结果向最低有效位(LSB) 方向移动(Shift) 1位,而最高有效位(MSB) 位置充零。然后提取并检查LSB:
2、假设LSB 为1,则存放器中的值与一个固定的预置值异或;假设LSB 为 0,则不进展异或操作。这个过程将重复直到执行完8 次移位。完成最终一次第8 次移位及相关操作后,下一个8位字节与存放器的当前值异或,然后又同上面描述过的一样重复8 次。当全部报文中子节都运算之后得到的存放器中的最终值,就是CRC.生成CRC 的过程为:1. 将一个16 位存放器装入十六进制FFFF (全1). 将之称作CRC 存放器.2. 将报文的第一个8位字节与16 位CRC 存放器的低字节异或,结果置于CRC 存放器.3. 将CRC 存放器右移1位(向LSB 方向), MSB 充零. 提取并检测LSB.4. (假设LS
3、B 为0): 重复步骤3 (另一次移位).(假设LSB 为1): 对CRC 存放器异或多项式值0xA001 (1010 0000 0000 0001).5. 重复步骤3 和 4,直到完成8 次移位。当做完此操作后,将完成对8位字节的完整操作。6. 对报文中的下一个字节重复步骤2 到5,连续此操作直至全部报文被处理完毕。7. CRC 存放器中的最终内容为CRC 值.8. 当放置 CRC 值于报文时,如下面描述的那样,凹凸字节必需交换。MODBUS 协议的 CRC 校验子程序代码为便利读者使用MODBUS协议,将VC、VB、ASM51环境下MODBUS协议的CRC校验子程序代码一并给出,供读者参考
4、。/*CRC Calculation for MODBUS Protocol for VC */数组 snd 为地址等传输字节,num 为字节数,发为 6 收为 5/ unsigned int mb_crc(BYTE *snd,int num)int i,j;unsigned int c,crc=0xFFFF for (i=0;inum;i )c=sndi & 0x00FF; crc=c; for(j=0,j=1; crc=0xA001;elsecrc=1return(crc);unsigned short int CrcCheck(const unsigned char * buffer,
5、const int buffLen)unsigned short int crcValue = 0;if (!buffer | buffLen 0)return crcValue;int CRCHi = 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41, 0x0,0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1,0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80,
6、 0x41, 0x0, 0xC1, 0x81,0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40,0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1,0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0,0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41
7、, 0x1, 0xC0, 0x80,0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41,0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0,0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0,0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1
8、, 0xC0, 0x80,0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41,0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1,0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1,0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC
9、1, 0x81,0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40,0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1,0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1,0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x
10、80,0x41, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40;int CRCLo = 0x0, 0xC0, 0xC1, 0x1, 0xC3, 0x3, 0x2, 0xC2, 0xC6, 0x6, 0x7, 0xC7, 0x5,0xC5, 0xC4, 0x4, 0xCC, 0xC, 0xD, 0xCD, 0xF, 0xCF, 0xCE, 0xE, 0xA, 0xCA,0xCB, 0xB, 0xC9, 0x9, 0x8, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB,0xDA, 0x1A, 0x1E, 0xDE, 0
11、xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14,0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11,0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36,0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF,0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39,
12、 0xF9, 0xF8, 0x38, 0x28,0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D,0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22,0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63,0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA
13、4, 0x6C,0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,0x50, 0x90, 0x
14、91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87,
15、0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,0x41, 0x81, 0x80, 0x40;int i, m;int dCRCHi = 0xFF; int dCRCLo = 0xFF;for (i = 0; i buffLen; i+)m = dCRCLo bufferi; dCRCLo = dCRCHi CRCHim; dCRCHi = CRCLom;crcValue = dCRCLo + (dCRCHi 8);return crcValue;” /*CRC Calculation for MODBUS Protocol for VB*/Function mb_crc(ByRef snd as BYTE,num as integer) as Long crc_l=crc_h=&HFFfor i=1 to num crc_l=crc_l XOR snd(i) for j=1 to 8if crc_l AND 1 then crc_l