基于MODBUS的CRC
%ws WCHAR wszName
设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。发送方编码方法:将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。用公式表示为 T(x)=xrP(x)+R(x)接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。
程序可以如下实现:
1)将Mx^r的前r位放入一个长度为r的寄存器;
2)如寄存器首位为1,将寄存器左移1位(将Mx^r剩下部分的MSB移入寄存器的LSB)再与G的后r位异或,否则仅将寄存器左移1位(将Mx^r剩下部分的MSB移入寄存器LSB);
3)重复第2步,直到M全部Mx^r移入寄存器;
4)寄存器中的值则为校验码。
ModBus 通信协议的 CRC ( 冗余循环校验码含2个字节, 即 16 位二进制数。CRC 码由发送设备计算, 放置于所发送信息帧的尾部。接收信息设备再重新计算所接收信息 (除 CRC 之外的部分)的 CRC, 比较计算得到的 CRC 是否与接收到CRC相符, 如果两者不相符, 则认为数据出错。
1) 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器。
2) 把第一个 8 位二进制数据 (通信信息帧的第一个字节) 与 16 位的 CRC寄存器的低 8 位相异或, 把结果放于 CRC寄存器。
3) 把 CRC 寄存器的内容右移一位( 朝低位)用 0 填补最高位, 并检查右移后的移出位。
4) 如果移出位为 0, 重复第 3 步 ( 再次右移一位); 如果移出位为 1, CRC 寄存器与多项式A001 ( 1010 0000 0000 0001) 进行异或。
5) 重复步骤 3 和步骤 4, 直到右移 8 次,这样整个8位数据全部进行了处理。
6) 重复步骤 2 到步骤 5, 进行通信信息帧下一个字节的处理。
7) 将该通信信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换。
8) 最后得到的 CRC寄存器内容即为 CRC码。
METHOD AND DEVICE FOR ACCESSING AND OBTAINING USER EQUIPMENT CONTEXT AND USER EQUIPMENT IDENTITY
3GPP Paging Test 寻呼测试
unsigned int CRC16 ( uchar *arr_buff, uchar len) { uint crc=0xFFFF; uchar i, j, Data; for ( j=0; j { crc=crc ^*arr_buff++; for ( i=0; i<8; i++) { if( ( crc&0x0001) >0) { crc=crc>>1; crc=crc^ 0xa001; } else crc=crc>>1; } } return ( crc); }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。