一、Modbus校驗碼計算公式
CRC即循環冗餘校驗(Cyclic Redundancy Check),是數據通信領域中最常用的一種查錯校驗碼。Modbus是一種串列通信協議,廣泛應用於工業自動化等領域。對於Modbus通信協議,CRC16-Modbus是最基本的校驗方式之一,其校驗結果為16位。
CRC16-Modbus計算公式如下:
unsigned short CRC16_MODBUS(unsigned char *puchMsg, unsigned int usDataLen) { unsigned short usCRC = 0xFFFF; while (usDataLen--) { usCRC ^= *puchMsg++; for (int i = 0; i > 1) ^ 0xA001; else usCRC >>= 1; } } return usCRC; }
其中,傳入參數為待校驗的消息、消息長度。返回值為計算得到的CRC16-Modbus校驗碼。
二、Modbus校驗碼計算器
為方便使用CRC16-Modbus校驗碼生成方式,我們可以使用在線計算器或者本地軟體進行校驗。
下面是一個在線計算器的實例:http://www.ip33.com/crc.html
使用該在線計算器,我們可以輸入待校驗的消息,選擇CRC16-Modbus校驗方式,點擊計算即可得到校驗結果。
三、CRC16-Modbus校驗碼的應用
CRC16-Modbus校驗碼可以應用於Modbus協議通信中的數據幀以及設備埠號等需要進行校驗的地方。一旦校驗碼出現錯誤,則可以證明通信過程中發生了數據傳輸錯誤,從而及時地進行糾錯和處理。
比如,我們可以在發送Modbus協議數據幀時,將消息內容分為數據部分和校驗部分,將計算得到的CRC16-Modbus校驗碼添加在校驗部分。接收方在接收到消息後,也同樣按照相同的方式計算CRC16-Modbus校驗碼,並比對接收到的校驗碼與計算得到的校驗碼是否一致。若一致,則表明此消息傳輸正確;否則,表明存在數據傳輸錯誤。
四、示例代碼
下面是一個示例的完整代碼。
unsigned short CRC16_MODBUS(unsigned char *puchMsg, unsigned int usDataLen) { unsigned short usCRC = 0xFFFF; while (usDataLen--) { usCRC ^= *puchMsg++; for (int i = 0; i > 1) ^ 0xA001; else usCRC >>= 1; } } return usCRC; } int main() { unsigned char testMsg[] = {0x01, 0x04, 0x00, 0x00, 0x00, 0x0A}; unsigned int testMsgLen = sizeof(testMsg) / sizeof(unsigned char); unsigned short crc = CRC16_MODBUS(testMsg, testMsgLen); printf("The CRC16 result is: %04X\n", crc); return 0; }
在該示例代碼中,我們通過調用CRC16_MODBUS函數得到了一個消息的CRC16校驗碼。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/256405.html