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

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM