Modbus通訊CRC16校驗程式

2022-03-06 17:06:53 字數 2496 閱讀 2256

modbus 通訊協議的crc ( 冗餘迴圈校驗碼)含2個位元組, 即 16 位二進位制數。crc碼由傳送裝置計算, 放置於所傳送資訊幀的尾部。接收裝置再重新計算所接收資訊的crc, 比較計算得到的crc是否與接收到的crc相符, 如果兩者不相符, 則認為資料出錯。

注意:仔細對比校驗多項式a005和8001的校驗過程,就會發現是一樣的.對比兩個二進位制高低位正好是完全相反的,crc校驗分為正向校驗與反向校驗。正向校驗高位在左,反向校驗低位在左,比如正向crc校驗的資料為0xaf5d=1010 1111 0101 1101b與0x8005異或時應該是0xaf5d^0x8005,而要使用0xa001與資料進行校驗也應該使0xaf5d高低位換順序為0xbaf5=1011 1010 1111 0101b。正向校驗使用左移位,反向校驗使用右移位,其實原理是一樣的,得看校驗的資料高低位順序】

1. crc16計算方法

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碼。

#include "

stdafx.h

"typedef unsigned

char

uint8_t;

typedef unsigned

short

uint16_t;

typedef unsigned

long

uint32_t;

typedef

intint32_t;

const uint16_t polynom = 0xa001;

uint16_t crc16bitbybit(uint8_t *ptr, uint16_t len)

while (len--)

else

}ptr++;

}return

(crc);}

/*table of crc values for high–order byte

*/const uint8_t crctablehi =;

/*table of crc values for low–order byte

*/const uint8_t crctablelo =;

uint16_t crc16table(uint8_t *ptr, uint16_t len)

return (crchi << 8 |crclo);}

const uint16_t crctalbeabs =;

uint16_t crc16tablefast(uint8_t *ptr, uint16_t len)

return

crc;}

void

modbuscrc16test()

; //

expected crc value 0xd825.

printf("

modbus crc16table test, expected value : 0xd825, calculate value : 0x%x\n

", crc16table(crc16_data, sizeof

(crc16_data)));

printf(

"modbus crc16tablefast test, expected value : 0xd825, calculate value : 0x%x\n

", crc16tablefast(crc16_data, sizeof

(crc16_data)));

printf(

"modbus crc16bitbybit test, expected value : 0xd825, calculate value : 0x%x\n

", crc16bitbybit(crc16_data, sizeof

(crc16_data)));

}

執行結果:

stm32f407上實現modbus協議,包括多種crc校驗演算法,讀取智慧型電表資料示例程式。

原始碼 Modbus協議中CRC16校驗

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

CRC 16校驗原理

1 迴圈校驗碼 crc碼 是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。2 生成crc 碼的基本原理 任意乙個由二進位制位串組成的 都可以和乙個係數僅為 0 和 1 取值的多項式一一對應。例如 1010111 對應的多項式為x6 x4 x2 x 1 而多項式為...

碼crc校驗 CRC16校驗計算流程

首先再次確認計算步驟 1 預置1個16位的暫存器為十六進製制ffff 即全為1111 1111 1111 1111 稱此暫存器為crc暫存器 2 把第乙個位轉換成8位二進位制資料 既通訊資訊幀的第乙個位元組 與16位的crc暫存器的低8位相異或,把結果放於crc暫存器,高八位資料不變 3 把crc暫...