CRC-16(循環(huán)冗余錯(cuò)誤校驗(yàn))
冗余循環(huán)碼(CRC)包含2個(gè)字節(jié),即16位二進(jìn)制。CRC碼由發(fā)送設(shè)備計(jì)算,放置于發(fā)送信息的尾部。接收信息的設(shè)備再重新計(jì)算接收到信息的CRC碼,比較計(jì)算得到的CRC碼是否與接收到的相符,如果兩者不相符,則表明出錯(cuò)。
在進(jìn)行CRC碼計(jì)算時(shí)只用8位數(shù)據(jù)位。起始位、停止位、奇偶校驗(yàn)位都不參與CRC碼計(jì)算。
計(jì)算CRC碼的步驟為:
、 預(yù)置16位寄存器為十六進(jìn)制FFFF(即全為1)。稱此寄存器為CRC寄存器。
、 把第一個(gè)8位數(shù)據(jù)與16位CRC寄存器的低位相異或運(yùn)算,把結(jié)果放于CRC寄存器。
、 把寄存器的內(nèi)容右移一位,用0填補(bǔ)最高位,檢查最低位。
、 如果最低位為0:重復(fù)第3步,再次右移一位;如果最低位為1:CRC寄存器與多項(xiàng)式A001(1010 0000 0000 0001)進(jìn)行異或運(yùn)算。
、 重復(fù)步驟③和④,直到右移8次,這樣整個(gè)8位數(shù)據(jù)全部進(jìn)行了處理。
、 重復(fù)步驟②到⑤,進(jìn)行下個(gè)8位數(shù)據(jù)的處理。
、 最后得到的CRC寄存器的值即為CRC碼。
⑧ 將CRC碼分成高8位和低8位,按低位在先,高位在后,將它們加到傳送數(shù)據(jù)之后。
直接法生成代碼:
unsigned short crc_16(unsigned char *Array, unsigned char *Rcvbuf,unsigned int Len)
{
unsigned int IX,IY,CRC;
CRC=0xFFFF;//set all 1
if (Len<=0)
CRC = 0;
else
{
Len--;
for (IX=0;IX<=Len;IX++)
{
CRC=CRC^(unsigned int)(Array[IX]);
for(IY=0;IY<=7;IY++)
{
if ((CRC&1)!=0 )
CRC=(CRC>>1)^0xA001;
else
CRC=CRC>>1; //
}
}
}
Rcvbuf[0] = (CRC & 0xff00)>>8;//高位置
Rcvbuf[1] = (CRC & 0x00ff); //低位置
CRC= Rcvbuf[0]<<8;
CRC+= Rcvbuf[1];
return CRC;
}
- PC官方版
- 安卓官方手機(jī)版
- IOS官方手機(jī)版