隨著技術的不斷進步,各种數据通信的應用越來越廣泛。由于傳輸距离、現場狀況、干扰等諸多因素的影響,設備之間的通信數据常會發生一些無法預測的錯誤。為了降低錯誤所帶來的影響,一般在通信時采用數据校驗的辦法,而循環冗余碼校驗是常用的重要校驗方法之一。 AVR高速嵌入式單片机是8位RISC MCU,執行大多數指令只需一個時鐘周期,速度快(8MHz AVR的運行速度約等于200MHz 80C51的運行速度),32個通用寄存器直接与ALU相連,消除了運算瓶頸;內嵌可串行下載或自我編程的Flash和EPPROM,功能繁多,具有多种運行模式。\r 本文采用Atmel公司的Atmega128高速嵌入式單片机,依照IEEE 1999年公布的802.11無線局域网協議標准,采用32位循環冗余校驗碼(Cyclic Redundancy Check)實現無線傳輸數据時的差錯校驗。 1 CRC循環冗余校驗碼原理 1.1 數据傳輸的幀格式 根据IEEE制定的802.11無線局域网絡協議,在數据傳輸時都應按照幀傳輸。這里,我們采用了信息處理系統-數据通信-高級數据鏈路控制規程-幀結构,它的每個幀由下列字段組成(傳輸順序自左至右):
|
|
控制——控制字段。
信息——信息字段;
CRC校驗位——根据前面三個字段生成的CRC校驗位。
由地址、控制、信息三個字段組成的總的字段統稱為數据段。 1.2 CRC校驗碼的理論生成方法 CRC校驗采用多項式編碼方法,被處理的數据塊可以看作是一個n階的二進制多項式。這里,假定待發送的二進制數据段為g(x),生成多項式為 m(x),得到的CRC校驗碼為c(x)。 CRC校驗碼的編碼方法是用待發送的二進制數据g(x)除以生成多項式m(x),將最后的余數作為CRC校驗碼,實現步驟如下。 設待發送的數据塊是m位的二進制多項式 g(x),生成多項式為r階的m(x)。在數据塊的末尾添加r個0,數据塊的長度增加到m+r位,對應的二進制多項式為G(x) 。 用生成多項式m(x)去除G(x) ,求得余數為階數是r-1的二進制多項式c(x)。此二進制多項式 c(x)就是g(x)經過生成多項式m(x)編碼的CRC校驗碼。 用模2的方式減去c(x),得到的二進制多項式就是包含了CRC校驗碼的待發送字符串。
CRC校驗可以100%地檢測出所有奇數個隨机錯誤和長度小于等于r(r為m(x)的階數)的突發錯誤。所以,CRC的生成多項式的階數越高,誤判的概率就越小。CCITT建議:2048 Kb/s的PCM基群設備采用CRC-4方案,使用的CRC校驗碼生成多項式m(x)=x4+x+1 。采用16位CRC校驗,可以保証在 1014bit碼元中只含有1位未被檢測出的錯誤 。在IBM的同步數据鏈路控制規程SDLC的幀校驗序列FCS中,使用CRC-16,其生成多項式m(x)=x16+x15+x2+1;而在CCITT推荐的高級數据鏈路控制規程HDLC的幀校驗序列FCS中,使用CCITT-16,其生成多項式m(x)= x16+x15+x5+1。CRC-32的生成多項式m(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1。CRC-32出錯的概率為CRC-16的10-5。由于CRC-32的可靠性,把CRC-32用于重要數据傳輸十分合适,所以在通信、計算机等領域運用十分廣泛。在一些UART通信控制芯片(如MC6582、Intel8273和Z80-SIO)內,都采用了CRC校驗碼進行差錯控制;以太网卡芯片、MPEG解碼芯片中,也采用CRC-32進行差錯控制。 m(x) 生成多項式的系數為0或1,但是m(x) 的首項系數為1,末項系數也必須為1。m(x) 的次數越高,其檢錯能力越強。 2 使用Atmega128生成32位CRC校驗碼 2.1 直接計算法生成32位CRC校驗碼 直接計算法就是依据CRC校驗碼的產生原理來設計程序。其优點是模塊代碼少,修改靈活,可移植性好。這种算法簡單,容易實現,對任意長度生成多項式m(x) 都适用。在發送的數据不長的情況下可以使用,但是如果發送的數据塊很長,這种方法就不太适合了。因為它1次只能處理1位數据,效率太低,運算量大。\r 計算法生成32位CRC校驗碼的流程如圖1所示。
![]() |
![]() |
![]() |


