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...