采用如下的CRC校驗方法
冗余循環(huán)碼(CRC)包含2個字節(jié)。CRC碼由發(fā)送設(shè)備計算妻坝,放置于發(fā)送信息的尾部娩梨。接收信息的設(shè)備再重新計算接接收到信息的CRC碼,比較計算得到的CRC碼是否與接收到的相符鲜锚,如兩者不相符,則表明出錯苫拍。
CRC碼的計算方法是芜繁,先預(yù)置16位寄存器全為1。再逐步把8位數(shù)據(jù)信息進(jìn)行處理绒极。在進(jìn)行CRC碼計算時只用8位數(shù)據(jù)位骏令;起始位、停止位及奇偶校驗位都不參與CRC碼計算垄提。
計算CRC碼的步驟:
- 預(yù)置16bits寄存器為為0xFFFF(即全為1)榔袋,稱此寄存器位CRC寄存器。
- 把第一個8bits數(shù)據(jù)與16bits CRC寄存器的低位相異或铡俐,把結(jié)果放于CRC寄存器凰兑。
- 把CRC寄存器的內(nèi)容右移一位(朝低位),用0填補(bǔ)最高位审丘,檢查最低位吏够。
- 如果最低位為0:重復(fù)第3步;如果最低位為1:CRC寄存器與0xA001進(jìn)行異或運(yùn)算滩报。
- 重復(fù)步驟3和4锅知,直至右移8次,這樣整個8bits數(shù)據(jù)全部進(jìn)行了處理脓钾。
- 重復(fù)步驟2到步驟5售睹,進(jìn)行下一個8bits數(shù)據(jù)的處理。
- 最后得到的CRC寄存器即為CRC碼可训。
代碼如下:
void crc16(uint8_t data,uint16_t* crc){
uint8_t i=0;
while(i<8){
*crc ^= ((uint16_t)data);
shift: *crc >>=1;
if(*crc&0x0001)
*crc ^=0xa001;
else
goto shift;
i++;
}
}