zoukankan      html  css  js  c++  java
  • 基于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码。

    Modbus CRC编码的程序代码:

    1、VB.NET代码

        Private Function Get_CRC16(ByVal Crc16_num As Byte(), ByVal nLength As Byte) As UShort
            Dim i, j As UShort
            Dim crc As UShort
            crc = &HFFFF
            For i = 0 To nLength - 1 Step 1
                crc = crc Xor Crc16_num(i)
                For j = 0 To 7 Step 1
                    If (crc And &H1) > 0 Then
                        crc = crc >> 1
                        crc = crc Xor &HA001
                    Else
                        crc = crc >> 1
                    End If
                Next j
            Next i
            Return crc
        End Function

    2、c语言代码

    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);

    }

  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/jungle1989/p/6372527.html
Copyright © 2011-2022 走看看