基于MODBUS的CRC

%ws   WCHAR wszName 

 CRC原理 

设编码前的原始信息多项式为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 crc16

基于MODBUS 协议的CRC16程序实现

    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 寻呼测试

基于MODBUS的CRC
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);
}
View Code

基于MODBUS的CRC,布布扣,bubuko.com

基于MODBUS的CRC

上一篇:SQL Server 排序函数 ROW_NUMBER和RANK 用法总结


下一篇:ORACLE查数据库中所有的表和某个用户下的表、解锁用户,查看日志文件