基於MODBUS 協議的CRC16程式實現

2021-07-05 08:11:54 字數 1292 閱讀 5049

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)

else

crc=crc>>1; }}

return ( crc); }

基於MThings玩轉MODBUS協議資料配置表

日常除錯測試過程中,可能會碰到調測環境總是在變化,更換乙個環境後,除錯口和裝置位址都可能不一樣,但是我們總是期望能保留已有的資料配置,無縫切換並適配新的環境。mthings為了解決這個問題,提供資料模板機制,並支援其裝置動態修改所屬鏈結和位址。其中資料模板機制,可參考部落格 基於mthings分享m...

原始碼 Modbus協議中CRC16校驗

modbus的資料校驗方法 crc 16 迴圈冗餘錯誤校驗 crc 16錯誤校驗程式如下 報文 此處只涉及資料位,不指起始位 停止位和任選的奇偶校驗 位 被看作是乙個連續的二進位制,其最高有效位 msb 首選傳送。報文先與x 16相乘 左移16位 然後看x 16 x 15 x 2 1除x 16 x ...

crc16碼表的使用 Modbus協議CRC校驗

modbus協議crc校驗 最近在開發modbus協議閘道器,使用到了crc校驗,做了一點記錄,希望對有需要的人有點幫助。crc16高位碼表 static const uint8 crc16hitable 0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0x...