CRC-16/MODBUS 算法:
在CRC計算時只用8個數據位,起始位及中止位,若有奇偶校驗位也包括奇偶校驗位,都不參與CRC計算。
CRC計算方法是:
一、 加載一值爲0XFFFF的16位寄存器,此寄存器爲CRC寄存器。
二、 把第一個8位二進制數據(即通信信息幀的第一個字節)與16位的CRC寄存器的相異或,異或的結果仍存放於該CRC寄存器中。
三、 把CRC寄存器的內容右移一位,用0填補最高位,並檢測移出位是0仍是1。
四、 若是移出位爲零,則重複第三步(再次右移一位);若是移出位爲1,CRC寄存器與0XA001進行異或。
五、 重複步驟3和4,直到右移8次,這樣整個8位數據所有進行了處理。
六、 重複步驟2和5,進行通信信息幀下一個字節的處理。
七、 將該通信信息幀全部字節按上述步驟計算完成後,獲得的16位CRC寄存器的高、低字節進行交換
八、 最後獲得的CRC寄存器內容即爲:CRC校驗碼。算法
C#代碼:ide
void ModBusCRC16(ref byte[] cmd, int len) { ushort i, j, tmp, CRC16; CRC16 = 0xFFFF; //CRC寄存器初始值 for (i = 0; i < len; i++) { CRC16 ^= cmd[i]; for (j = 0; j < 8; j++) { tmp = (ushort)(CRC16 & 0x0001); CRC16 >>= 1; if (tmp == 1) { CRC16 ^= 0xA001; //異或多項式 } } } cmd[i++] = (byte) (CRC16 & 0x00FF); cmd[i++] = (byte) ((CRC16 & 0xFF00)>>8); }