『壹』 CRC-16 計算方法及程序設計
CRC-16演算法是一種用於數據傳輸錯誤檢測的常用校驗技術,它基於16位的二進制寄存器對數據幀中的每個位元組進行異或運算和位移操作。發送設備在數據幀尾部添加生成的CRC值,接收端則重新計算並與接收到的值對比,確認數據完整無誤。具體步驟如下:
1. 初始化16位CRC寄存器為全1(0xFFFFH)。
2. 對數據幀的第一個位元組的8位進行異或操作,將結果存回寄存器。
3. 移位操作:將寄存器右移一位,高位補0,低位丟棄並檢測。
4. 若低位為1,則寄存器與預設值0xA001進行異或;否則,僅做右移。
5. 重復步驟3和4,直至完成8次移位,處理一個完整的8位位元組。
6. 對下一個位元組重復此過程,直至處理完所有位元組。
7. CRC寄存器的最終值即為CRC校驗值。
以示例數據0x03 0x10 0x00 0x01 0x00 0x08為例,通過C語言實現的CRC-16計算過程展示了這個過程。在VHDL語言中,也有類似的進程來接收數據並進行CRC校驗,涉及狀態機和邏輯運算,確保數據的正確傳輸和接收。
『貳』 crc16校驗的c語言程序
下面我們以CRC-16為例來說明任意長度數據流的CRC校驗碼生成過程。我們採用將數據流分成若干個8bit字元,並由低位元組到高位元組傳送的並行方法來求CRC校驗碼。具體計算過程為:用一個16bit的寄存器來存放CRC校驗值,且設定其初值為0x0000;將數據流的第一個8bit與16bit的CRC寄存器的高位元組相異或,並將結果存入CRC寄存器高位元組;CRC寄存器左移一位,最低1bit補零,同時檢查移出的最高1bit,若移出的最高1bit為0,則繼續按上述過程左移,若最高1bit為1,則將CRC寄存器中的值與生成多項式碼相異或,結果存入CRC寄存器值;繼續左移並重復上述處理方法,直到將8bit數據處理完為止,則此時CRC寄存器中的值就是第一個8bit數據對應的CRC校驗碼;然後將此時CRC寄存器的值作為初值,用同樣的處理方法重復上述步驟來處理下一個8bit數據流,直到將所有的8bit字元都處理完後,此刻CRC寄存器中的值即為整個數據流對應的CRC校驗碼。
下面示出了其計算過程的流程圖:
在用C語言編寫CRC校驗碼的實現程序時我們應該注意,生成多項式 對應的十六進制數為0x18005,由於CRC寄存器左移過程中,移出的最高位為1時與 相異或,所以與16bit的CRC寄存器對應的生成多項式的十六進制數可用0x8005表示。下面給出並行處理8bit數據流的C源程序:
unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)
//reg為crc寄存器, data_crc為將要處理的8bit數據流
{
unsigned short msb; //crc寄存器將移出的最高1bit
unsigned short data;
unsigned short gx = 0x8005, i = 0; //i為左移次數, gx為生成多項式
data = (unsigned short)data_crc;
data = data << 8;
reg = reg ^ data;
do
{
msb = reg & 0x8000;
reg = reg << 1;
if(msb == 0x8000)
{
reg = reg ^ gx;
}
i++;
}
while(i < 8);
return (reg);
}
以上為處理每一個8bit數據流的子程序,在計算整個數據流的CRC校驗碼時,我們只需將CRC_reg的初值置為0x0000,求第一個8bit的CRC值,之後,即可將上次求得的CRC值和本次將要處理的8bit數據作為函數實參傳遞給上述子程序的形參進行處理即可,最終返回的reg值便是我們所想得到的整個數據流的CRC校驗值。