日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月13日(星期日)

2021年07月13日 | CRC校驗的原理及實現(xiàn)方法

發(fā)布者:innovator8 來源: eefocus關(guān)鍵字:CRC校驗  實現(xiàn)方法 手機看文章 掃描二維碼
隨時隨地手機看文章

一、CRC校驗介紹

        循環(huán)冗余校驗碼(CRC),是一種常用的、具有檢錯、糾錯能力的校驗碼,在早期的通信中運用廣泛。循環(huán)冗余校驗碼常用于外存儲器計算機同步通信的數(shù)據(jù)校驗。循環(huán)冗余校驗是通過某種數(shù)學(xué)運算來建立數(shù)據(jù)位和校驗位的約定關(guān)系的。


        與奇偶校驗、和校驗、異或校驗等校驗方式不同,CRC校驗的計算過程相對復(fù)雜很多。


二、模2除法介紹

        CRC校驗原理雖然看起來比較復(fù)雜,其實也不難理解,其根本思想就是先在要發(fā)送的幀后面附加一個數(shù),生成一個新幀發(fā)送給接收端。當(dāng)然,這個附加的數(shù)不是隨意的,它要使所生成的新幀能與發(fā)送端和接收端共同選定的某個特定數(shù)整除。這里不是直接采用二進制除法,而是采用一種稱之為“模2除法”。到達接收端后,再把接收到的新幀除以(同樣采用“模2除法”)這個選定的除數(shù)。因為在發(fā)送端發(fā)送數(shù)據(jù)幀之前就已通過附加一個數(shù),做了“去余”處理,所以結(jié)果應(yīng)該是沒有余數(shù),結(jié)果能夠被除數(shù)整除。如果有余數(shù),則表明該幀在傳輸過程中出現(xiàn)了差錯。


        這里,為了能夠?qū)RC校驗有深入了解,我們來介紹一下模2除法。與“算術(shù)除法”類似,但它既不向上位借位,也不比較除數(shù)和被除數(shù)的相同位數(shù)值的大小,只要以相同位數(shù)進行相除即可。模2減法運算實際上是按位異或運算。也就是比較后,兩者對應(yīng)位相同則結(jié)果為“0”,不同則結(jié)果為“1”。如下圖所示,二進制的數(shù)1010101除以1001,結(jié)果得到商為1011,余數(shù)為110。

三、CRC校驗原理

        上面我們對CRC校驗進行了簡單介紹,下面我們就來看看CRC校驗是如何實現(xiàn)的。


       首先,為了進行CRC校驗,發(fā)送端和接收端要約定一個除數(shù),這個除數(shù)通常是以多項方式表示,這個多項式也稱之為“生成多項式”。如常用的多項式x4 + x + 1,表示的除數(shù)為10011,多項式x16 + x15 + x2 + 1表示的除數(shù)為11000000000000101,下表列出了常用的除數(shù)多項式公式。


CRC算法名稱 多項式公式 寬度 多項式 初始值 結(jié)果異或值 輸入反轉(zhuǎn) 輸出反轉(zhuǎn)

CRC-4/ITU x4 + x + 1 4 03 00 00 true true

CRC-5/EPC x5 + x3 + 1 5 09 09 00 false false

CRC-5/ITU x5 + x4 + x2 + 1 5 15 00 00 true true

CRC-5/USB x5 + x2 + 1 5 05 1F 1F true true

CRC-6/ITU x6 + x + 1 6 03 00 00 true true

CRC-7/MMC x7 + x3 + 1 7 09 00 00 false false

CRC-8 x8 + x2 + x + 1 8 07 00 00 false false

CRC-8/ITU x8 + x2 + x + 1 8 07 00 55 false false

CRC-8/ROHC x8 + x2 + x + 1 8 07 FF 00 true true

CRC-8/MAXIM x8 + x5 + x4 + 1 8 31 00 00 true true

CRC-16/IBM x16 + x15 + x2 + 1 16 8005 0000 0000 true true

CRC-16/MAXIM x16 + x15 + x2 + 1 16 8005 0000 FFFF true true

CRC-16/USB x16 + x15 + x2 + 1 16 8005 FFFF FFFF true true

CRC-16/MODBUS x16 + x15 + x2 + 1 16 8005 FFFF 0000 true true

CRC-16/CCITT x16 + x12 + x5 + 1 16 1021 0000 0000 true true

CRC-16/CCITT-FALSE x16 + x12 + x5 + 1 16 1021 FFFF 0000 false false

CRC-16/X25 x16 + x12 + x5 + 1 16 1021 FFFF FFFF true true

CRC-16/XMODEM x16 + x12 + x5 + 1 16 1021 0000 0000 false false

CRC-16/DNP x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1 16 3D65 0000 FFFF true true

CRC-32 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 32 04C11DB7 FFFFFFFF FFFFFFFF true true

CRC-32/MPEG-2 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 32 04C11DB7 FFFFFFFF 00000000 false false

        選定了除數(shù)之后,需要在要發(fā)送的數(shù)據(jù)后面加上k-1位“0”,k為除數(shù)的位數(shù)。然后以這個加了k-1個“0“的新數(shù)(一共是m+k-1位)以“模2除法”方式除以上面這個除數(shù),所得到的余數(shù)就是這個數(shù)據(jù)的CRC校驗碼。但要注意的是,余數(shù)的位數(shù)一定要是比除數(shù)位數(shù)只能少一位,即使前面位是0,甚至是全為0(附帶好整除時)也都不能省略。


        最后,再把這個校驗碼附加在原數(shù)據(jù)后面,構(gòu)建一個新幀發(fā)送到接收端;最后在接收端再把這個新幀以“模2除法”方式除以前面選擇的除數(shù),如果沒有余數(shù),則表明該幀在傳輸過程中沒出錯,否則出現(xiàn)了差錯。


        下面,我們通過一個例子來說明一下,CRC校驗的計算過程。


       假設(shè)我們計算十六進制數(shù)0xBB的CRC校驗碼,我們使用的生成多項式為x4 + x + 1。則待計算的數(shù)表示為二進制位1011 1011,除數(shù)為10011。由于生成多項式的位數(shù)為5,根據(jù)上面的介紹,得知CRC校驗碼的位數(shù)為4(校驗碼的位數(shù)比生成多項式的位數(shù)少1)。因此在原始數(shù)據(jù)后面再加4個0,得到1011 1011 0000,然后把這個數(shù)以“模2除法”方式除以生成多項式,得到的余數(shù)(即CRC碼)為1111,如下圖所示。

        把上步計算得到的CRC校驗1111替換原始幀1011 1011 0000后面的四個“0”,得到新幀1011 1011 1111。再把這個新幀發(fā)送到接收端。當(dāng)以上新幀到達接收端后,接收端會把這個新幀再用上面選定的除數(shù)10011以“模2除法”方式去除,驗證余數(shù)是否為0,如果為0,則證明該幀數(shù)據(jù)在傳輸過程中沒有出現(xiàn)差錯,否則出現(xiàn)了差錯。


四、CRC校驗的c代碼實現(xiàn)

        CRC校驗的計算過程比較復(fù)雜,一般代碼實現(xiàn)采用查表的方法。下面的代碼是CRC16校驗實現(xiàn)的代碼,對應(yīng)的CRC算法為CRC-16/MODBUS,生成多項式為x16 + x15 + x2 + 1。


#include

 

const unsigned char chCRCHTalbe[] = //CRC高位字節(jié)值表

{

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40

};

 

const unsigned char chCRCLTalbe[] = //CRC低位字節(jié)值表

{

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,

0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,

0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,

0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,

0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,

0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,

0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,

0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,

0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,

0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,

0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,

0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,

0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,

0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,

0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,

0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,

0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,

0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,

0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,

0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,

0x41, 0x81, 0x80, 0x40

};

 

unsigned short CRC16(unsigned char* pchMsg, unsigned short wDataLen)

{

unsigned char chCRCHi = 0xFF; // 高CRC字節(jié)初始化

unsigned char chCRCLo = 0xFF; // 低CRC字節(jié)初始化

unsigned short wIndex; // CRC循環(huán)中的索引

 

while(wDataLen--)

{

// 計算CRC

wIndex = chCRCLo ^ *pchMsg++ ;

chCRCLo = chCRCHi ^ chCRCHTalbe[wIndex];

chCRCHi = chCRCLTalbe[wIndex] ;

}

 

return((chCRCHi << 8) | chCRCLo) ;

}

 

void main()

{

unsigned char data[]={1,2,3,4,5,6};

 

unsigned short result;

 

result = CRC16(data,6);

 

printf("%X",result);

}

關(guān)鍵字:CRC校驗  實現(xiàn)方法 引用地址:CRC校驗的原理及實現(xiàn)方法

上一篇:Python實現(xiàn)的簡單的單片機串口助手程序
下一篇:最后一頁

推薦閱讀

北京—2018年7月12日—Maxim 宣布推出DS28E83 DeepCoverò安全認(rèn)證器,幫助醫(yī)療設(shè)備設(shè)計者有效保護外科工具的數(shù)據(jù),使其不受存儲器損壞、滅菌過程中高能γ輻射的影響,同時通過安全工具使用管理及防偽等能力保證工具安全。作為業(yè)界首款專為γ射線滅菌設(shè)計的安全認(rèn)證方案,器件可有效增強患者的安全保障,且同時支持基于橢圓曲線數(shù)字簽名算法 (ECDSA) ...
最小系統(tǒng)板要有處理器這是肯定的,既然我標(biāo)題都是STM32F103C8T6的最小系統(tǒng),那處理器就是C8T6了,電路圖上,加一塊芯片原理圖,如此簡單的操作就不做過多描述了。系統(tǒng)是需要有時鐘,這樣,你的系統(tǒng)跑起來會穩(wěn)定有序。STM32內(nèi)部自身就有三個時鐘源,這個看過32手冊時鐘樹的都會有一定的了解,在32芯片的時鐘樹中需要有五個時鐘源,我們需要布置的便是外部高...
  近日,浙江發(fā)改委發(fā)布《關(guān)于開展2020年度電力需求響應(yīng)工作的通知》,鼓勵儲能設(shè)施等負(fù)荷量大的用戶和負(fù)荷集成商參與電力需求響應(yīng),實現(xiàn)電力削峰填谷,促進可再生能源消納,進一步加快源網(wǎng)荷儲友好互動系統(tǒng)建設(shè)。   補貼標(biāo)準(zhǔn):削峰日前需求響應(yīng)按照單次響應(yīng)的出清價格、有效響應(yīng)電量進行補貼,出清價格設(shè)置4元/千瓦時價格上限;填谷日前需求響應(yīng)執(zhí)...
近日業(yè)界盛傳,Intel計劃以20億美元收購RISC-V IP供應(yīng)商SiFive——后者的產(chǎn)品已被80多家公司采納,設(shè)計了200多種產(chǎn)品,出貨量極大,廣泛用于各種加速器。雖然雙方對于收購都拒絕置評,但深入合作已經(jīng)展開。Intel官方宣布,將會打造自己的RISC-V開發(fā)平臺“Horse Creek”,基于SiFive最新的高性能核心Performance P550,而且還會采用自己的下一代7nm工藝...

史海拾趣

小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved