串列埠通訊的CRC演算法與實現

2021-06-05 10:57:32 字數 1955 閱讀 7263

crc的全稱為cyclic redundancy check,中文名稱為迴圈冗餘校驗。它是一類重要的線性分組碼,編碼和解碼方法簡單,檢錯和糾錯能力強,在通訊領域廣泛地用於實現差錯控制。實際上,除資料通訊外,crc在其它很多領域也是大有用武之地的。例如我們讀軟盤上的檔案,以及解壓乙個zip檔案時,偶爾會碰到「bad crc」錯誤,由此它在資料儲存方面的應用可略見一斑。

利用crc進行檢錯的過程可簡單描述為:在傳送端根據要傳送的k位二進位製碼序列,以一定的規則產生乙個校驗用的r位監督碼(crc碼),附在原始資訊後邊,構成乙個新的二進位製碼序列數共k+r位,然後傳送出去。在接收端,根據資訊碼和crc碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。這個規則,在差錯控制理論中稱為「生成多項式」。

位元組型演算法

位元型演算法逐位進行運算,效率比較低,不適用於高速通訊的場合。數字通訊系統(各種通訊標準)一般是對一幀資料進行crc校驗,而位元組是幀的基本單位。最常用的是一種按位元組查表的快速演算法。該演算法基於這樣乙個事實:計算本位元組後的crc碼,等於上一位元組余式crc碼的低8位左移8位,加上上一位元組crc右移8位和本位元組之和後所求得的crc碼。如果我們把8位二進位制序列數的crc(共256個)全部計算出來,放在乙個表裡 ,編碼時只要從表中查詢對應的值進行處理即可。

crc-itu的計算演算法如下:

a.暫存器組初始化為全"1"(0xffff)。

b.暫存器組向右移動乙個位元組。

c.剛移出的那個位元組與資料位元組進行異或運算,得出乙個指向值表的索引。

d.索引所指的錶值與暫存器組做異或運算。

f.資料指標加1,如果資料沒有全部處理完,則重複步驟b。

g.暫存器組取反,得到crc,附加在資料之後。

crc-itu的驗證演算法如下:

a.暫存器組初始化為全"1"(0xffff)。

b.暫存器組向右移動乙個位元組。

c.剛移出的那個位元組與資料位元組進行異或運算,得出乙個指向值表的索引。

d.索引所指的錶值與暫存器組做異或運算。

e.資料指標加1,如果資料沒有全部處理完,則重複步驟b (資料報括crc的兩個位元組)。

f.暫存器組的值是否等於「magic value」(0xf0b8),若相等則通過,否則失敗。

下面是通用的crc-itu查詢表以及計算和驗證crc的c語言程式:

// crc-itu查詢表

const u16 crctab16 =

;

// 計算給定長度資料的16位crc。

u16 getcrc16(const byte* pdata, int nlength)

return ~fcs; // 取反

}

// 檢查給定長度資料的16位crc是否正確。

bool iscrc16good(const byte* pdata, int nlength)

return (fcs == 0xf0b8); // 0xf0b8是crc-itu的"magic value"

}

使用位元組型演算法,前面出現的ppp幀fcs計算和驗證過程,可用下面的程式片斷實現:

byte ppp[13] = ;

u16 result;

// 計算crc

result = getcrc16(ppp, 11);

// 填寫fcs,先低後高

ppp[11] = result & 0xff;

ppp[12] = (result >> 8) & 0xff;

// 驗證fcs

if(iscrc16good(ppp, 13))

該例中資料長度為11,說明crc計算並不要求資料2位元組或4位元組對齊。

至於查詢表的生成演算法,以及crc-32等其它crc的演算法,可參考rfc 1661, rfc 3309等文件。需要注意的是,雖然crc演算法的本質是一樣的,但不同的協議、標準所規定的初始化、移位次序、驗證方法等可能有所差別。

串列埠通訊中CRC16校驗類的實現

一 crc16簡介 迴圈冗餘碼crc檢驗技術廣泛應用於測控及通訊領域。crc計算可以靠專用的硬體來實現,但是對於低成本的微控制器系統,在沒有硬體支援下實現crc檢驗,關鍵的問題就是如何通過軟體來完成crc計算,也就是crc演算法的問題。下面給出按位元組計算crc16的演算法。二 crc16演算法 其...

串列埠通訊資料處理演算法分析與實現

原文 1,應用背景分析 在很多的實際工程應用中,通訊方式通常是rs232 rs485 i2c和spi等等。這類介面都有乙個共同的特點 按照位元組流的方式來進行通訊,即每中斷一次,表明成功傳送或者接收乙個位元組。而乙太網一次可以傳輸1k多個位元組。由於乙太網有專門的tcp ip協議棧來處理,這裡我們不...

串列埠通訊實現

前段時間編寫了串列埠通訊的 用的是rs 232資料線 include 標準輸入輸出定義 include 標準函式庫定義 include unix 標準函式定義 include include include include include include define dev dev ttys1 d...