在CRC計算時只用8個數據位,起始位及停止位,如有奇偶校驗位也包括奇偶校驗位,都不參與CRC計算。
CRC計算方法是:
1、 預置1個16位的寄存器為十六進制FFFF(全1),此寄存器為CRC寄存器
unsigned short wcrc = 0xFFFF; //16位CRC寄存器預置
2、 把第一個8位二進制數據(即通訊信息幀的第一個字節)與16位的CRC寄存器的低八位相異或,把結果存放於CRC寄存器。
temp = *buffer & 0x00FF; //將八位數據與crc寄存器亦或 buffer++; //指針地址增加,指向下個數據 wcrc ^= temp; //將數據存入crc寄存器
3、 把CRC寄存器的內容右移一位(朝低位)用0填補最高位,並檢測右移后的移出位。
4、 如果移出位為零,則重復第三步(再次右移一位);如果移出位為1,CRC寄存器與多項式A001進行異或。
5、 重復步驟3和4,直到右移8次,這樣整個8位數據全部進行了處理。
for (j = 0; j < 8; j++) //循環計算數據的 { if (wcrc & 0x0001) //判斷右移出的是不是1,如果是1則與多項式進行異或。 { wcrc >>= 1; //先將數據右移一位 wcrc ^= 0xA001; //與上面的多項式進行異或 } else //如果不是1,則直接移除 { wcrc >>= 1; //直接移除 } }
6、 重復步驟2和5,進行通訊信息幀下一個字節的處理。
7、 將該通訊信息幀所有字節按上述步驟計算完成后,得到的16位CRC寄存器的高、低字節進行交換
8、 最后得到的CRC寄存器內容即為:CRC校驗碼。
附完整代碼如下:
#include<stdio.H> #include<stdlib.H> unsigned short GetCRCData(unsigned char *buffer,unsigned len) { unsigned short wcrc = 0xFFFF; //16位CRC寄存器預置 unsigned char temp; unsigned i = 0, j = 0; //計數 for (i = 0; i < len; i++) //循環計算每個數據 { temp = *buffer & 0x00FF; //將八位數據與crc寄存器亦或 buffer++; //指針地址增加,指向下個數據 wcrc ^= temp; //將數據存入crc寄存器 for (j = 0; j < 8; j++) //循環計算數據的 { if (wcrc & 0x0001) //判斷右移出的是不是1,如果是1則與多項式進行異或。 { wcrc >>= 1; //先將數據右移一位 wcrc ^= 0xA001; //與上面的多項式進行異或 } else //如果不是1,則直接移除 { wcrc >>= 1; //直接移除 } } } unsigned char CRC_L,CRC_H; //定義數據高低位 CRC_L = wcrc & 0xFF; //CRC的低8位 CRC_H = wcrc >> 8; //CRC的高8位 return((CRC_L << 8) | CRC_H); } int main(void) { unsigned short crc; unsigned char buffer[6]; buffer[0] = 0x01; buffer[1] = 0x06; buffer[2] = 0x01; buffer[3] = 0x00; buffer[4] = 0x00; buffer[5] = 0x02; crc = GetCRCData(&buffer[0], 6); printf("%X\n",crc); getchar(); }
感謝有幫助的小伙伴轉走。
、
、
、
、
、
持之以恆的學習是人類進步的階梯