1. 程式人生 > >1.LabVIEW之CRC校驗

1.LabVIEW之CRC校驗

CRC的概念:

首先說一下CRC的基本概念,CRC(Cyclic Redundancy Check)官網是這樣解釋的:CRC是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊欄位和校驗欄位的長度可以任意選定。

迴圈冗餘檢查(CRC)是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。

CRC的原理:

其原理說白了就是在要傳送的數後面加上“一個數”(這個數不是隨便加的,後面會說怎計算這個數,先透漏一下,這個數就叫做校驗碼),形成一個新的數,然後就可以傳送啦!作為接收端開始接收這個數,接收到這個數以後要做的事就是,用這個數除以“另一個數”(這裡的“另一個數”後面也講,還有就是這裡的除法也不是你想想中的除法,它叫模2除法,you know?),如果沒有餘數的話,那麼恭喜,傳輸沒有出錯。

 

“一個數”是怎麼來的?

在求“一個數”是怎麼來的之前需要知道“另一個數”是怎麼來的,“另一個數”你可自己隨便定,你的地盤你做主,但是前提是有條件的,什麼條件?你定的這個數的第一位和最後一位必須是1,you know?哈哈,我就知道你懶,你很定會說,我才懶得定呢。所以有操心認識幫你整理了一些,供你參考,說白了就是直接那個過來直接用,那麼這個拿過來直接用的數,就是上面咱提的“另一個數”。可以在下面選:

  CRC-4         x4+x+1                 1 0011

   CRC-8         x8+x5+x4+1           1 0011 0001                

   CRC-8         x8+x2+x1+1            1 0000 0111              

   CRC-8         x8+x6+x4+x3+x2+x1       1 0101 1110

   CRC-12        x12+x11+x3+x+1         1 1000 0000 1011

   CRC-16        x16+x15+x2+1            1 1000 0000 0000 0101

...........還有其他的。

當我們選出“另一個數”後接下來的工作就是求“一個數”,怎麼求啊?就是用你的原始資料用模2除法(模2 不會的就不在這講了,其實就是異或,不會的直接去百度吧)去出剛才的“另一個數”的到的餘數,就是咱們要求的“一個數”,把它加在原始資料的後面一塊發出去就可以啦!!

 

再重複一些具體步驟:
1. 選擇合適的除數
2. 看選定除數的二進位制位數,然後再要傳送的資料幀上面加上這個位數-1位的0,然後用新生成的幀以模2除法的方式除上面的除數,得到的餘數就是該幀的CRC校驗碼。注意,餘數的位數一定只比除數位數少一位,也就是CRC校驗碼位數比除數位數少一位,如果前面位是0也不能省略。
3. 將計算出來的CRC校驗碼附加在原資料幀後面,構建成一個新的資料幀進行傳送;最後接收端在以模2除法方式除以前面選擇的除數,如果沒有餘數,則說明資料幀在傳輸的過程中沒有出錯。
 

好,光說不練是假把式,來一個練練手。

假設咱要求出二進位制序列10110011的CRC校驗碼。

選擇的CRC生成多項式為G(X) = X4 + X3 + 1,

①將多項式轉化為二進位制序列,由G(X) = X4 + X3 + 1 可知序列為11001

②多項式的位數位5,則在資料幀的後面加上5-1位0,資料幀變為101100110000,然後使用模2除法除以除數11001,得到餘數。

③將計算出來的CRC校驗碼新增在原始幀的後面,真正的資料幀為101100110100,再把這個資料幀傳送到接收端。

④接收端收到資料幀後,用上面選定的除數,用模2除法除去,驗證餘數是否為0,如果為0,則說明資料幀沒有出錯。

 

上面介紹了CRC 的基本原理,那麼我們要是變成的怎麼變啊,還是一頭霧水,不著急,下面就是超詳細的步驟教你如何程式設計:

(1)、預置1個16位的暫存器為十六進位制FFFF(即全為1),稱此暫存器為CRC暫存器;
(2)、把第一個8位二進位制資料(既通訊資訊幀的第一個位元組)與16位的CRC暫存器的低
       8位相異或,把結果放於CRC暫存器,高八位資料不變;
(3)、把CRC暫存器的內容右移一位(朝低位)用0填補最高位,並檢查右移後的移出位;
(4)、如果移出位為0:重複第3步(再次右移一位);如果移出位為1,CRC暫存器與多

    項式A001(1010 0000 0000 0001)進行異或;
(5)、重複步驟3和4,直到右移8次,這樣整個8位資料全部進行了處理;
(6)、重複步驟2到步驟5,進行通訊資訊幀下一個位元組的處理;
(7)、將該通訊資訊幀所有位元組按上述步驟計算完成後,得到的16位CRC暫存器的高、低
       位元組進行交換;
(8)、最後得到的CRC暫存器內容即為:CRC碼。

以上計算步驟中的多項式A001是8005按位顛倒後的結果。

查表法是將移位異或的計算結果做成了一個表,就是將0~256放入一個長度為16位的暫存器中的低八位,高八位填充0,然後將該暫存器與多項式0XA001按照上述3、4步驟,直到八位全部移出,最後暫存器中的值就是表格中的資料,高八位、低八位分別單獨一個表。

labview程式示例:

                                                                                 CRC16示例

                                                                               CRC8示例

 

上面的labview源程式想下載可以直接點選連結即可下載,例程簡單,清晰明瞭,,點我下載例程