首先再次確認計算步驟:
1)、預置1個16位的寄存器為十六進位FFFF(即全為1111 1111 1111 1111),稱此寄存器為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,用上一個CRC的結果與進行通訊信息幀下一個字節的處理;
7)、將該通訊信息幀所有字節按上述步驟計算完成後,得到的16位CRC寄存器的高、低字節進行交換;
8)、最後得到的CRC寄存器內容即為:CRC碼。
實例:發送數據 2D 00 03 07 計算出校驗碼
第一步確認CRC校驗的模型為 CRC-16/modbus 多項式為X16+X15+X2+1
第二步由標準CRC生成多項式表可查出多項式的簡寫為8005。
8005轉換成4位八進位為 1000 0000 0000 0101
高低位字節顛倒生成多項式1010 0000 0000 0001
開始計算:
1)把第一個字節2D轉找成8位二進位0010 1101 與CRC寄存器FFFF低8位進行異或。
2)異或的結果放的CRC寄存器中
3)CRC寄存器內容右移
4)右移為0,再移 右移為1與多項式1010 0000 0000 0001異或
5)直到第一個字節的8位全部處理完
6)用第一個字異或的結果低8位與第二個字節進行異或。
7)直到5個字節全部處理完,得到的CRC碼
8)把得到的CRC碼 進行高低字節交接,就是最後的校驗碼
計算過程見手寫圖:
計算得到的結果為 1100 0100 0011 1001轉換為十六進位為 C4 39 進行高低字節交換得到校驗碼為 39 C4
與軟體計算的結果對比一至 如圖
發送數據 2D 00 03 07
加上校驗碼發送的數據 2D 00 03 07 39 C4