CRC 校驗
由於最近要控制一個伺服電機,用到了串口modbus協議,用到的是rtu模式。協議也是起始幀加數據幀加CRC校驗。特此係統記錄一下crc校驗。
CRC概念
首先crc就是一個附在一串報文後面的一個16位二進制的數,由發送設備計算。接受的設備在接收報文後重新計算CRC,然後把這個值和接收到的CRC數據進行對比,如果兩個值相等·就校驗成功,若兩個值不相等,則爲錯誤。
CRC計算方式
CRC的計算,首先對一個16位寄存器預裝全1,然後將報文中連續的8位子節對其進行後續的計算。起始位停止位一般不參與CRC計算。
1: 把一個16位寄存器全部裝入1,FFFF將這個寄存器稱爲CRC寄存器。
2: 把報文的第一個八位字節和16位CRC寄存器低字節異或,結果置於CRC寄存器。
3:把CRC寄存器右移一位,MSB充零(最高有效位),提取並檢測LSB。
4:如果LSB(最低位)是0則繼續第三步,如果是1則對CRC寄存器.
5: 重複3和4兩個步驟,直到完成8次移位。
6:對報文中2-5步驟重複,直到所有報文被處理。
7: CRC寄存器中生成最終的CRC校驗碼
8:當CRC值放在報文中的時候高低字節必須交換位置。
c語言實現CRC校驗實例
unsigned char *data;
unsigned char length;
unsigned int crc_chk(unsigned char *data,unsigned char length)
{
int i,j;
unsigned int crc_reg =0xffff;
while(length--)
{
crc_reg^=*data++;
for(j=0;j<8;j++)
{
if(crc_reg&0x01)
{
crc_reg=(crc_reg>>1)^0xa001;
}
else
{
crc_reg=crc_reg>>1;
}
}
}
return crc_reg;
}