CRC校驗(yàn)最終個(gè)人總結(jié)
CRC校驗(yàn)最終個(gè)人總結(jié):某二進(jìn)制信息碼(kn)的CRC校驗(yàn)需選
擇一個(gè)合適的g(x)除數(shù)(校驗(yàn)因子)如:CRC-7為X+X+1=10001001
73寬度為7,此校驗(yàn)因子根據(jù)設(shè)計(jì)的需求來選擇(如:CRC-32/CRC-16)。注意,在計(jì)算CRC前必須將二進(jìn)制信息碼左移7位(kn*2),這里的7來源于所選擇的檢驗(yàn)因子的寬度。然后,再與除數(shù)進(jìn)行模2運(yùn)算(從kn的最高位開始和除數(shù)進(jìn)行異或運(yùn)算)。最后所剩的寬度為7的7位余數(shù)就是最終CRC計(jì)算結(jié)果(當(dāng)計(jì)算到只剩7位余數(shù)時(shí)就不要再計(jì)算了)。之后就可以將經(jīng)過CRC校驗(yàn)后的信息碼+CRC一起發(fā)送給對(duì)方,對(duì)方收到添有CRC的信息碼后,將這串代碼再和校驗(yàn)因子進(jìn)行異或運(yùn)算看結(jié)果是否為0。例如:kn=01000000=0x40g(x)=X+X+1=10001001寬度為7
1:移位01000000左移7位=100000000000002:異或運(yùn)算
10000000000000
10001001校驗(yàn)因子1001000000
10001001
1100100最終CRC計(jì)算結(jié)果3:傳輸發(fā)送
10000001100100
信息碼CRC結(jié)果4:接收檢驗(yàn)
10000001100100
10001001校驗(yàn)因子1000100100
10001001校驗(yàn)因子0
73擴(kuò)展閱讀:單片機(jī)crc校驗(yàn)實(shí)驗(yàn)報(bào)告
單片機(jī)課程總實(shí)驗(yàn)
實(shí)現(xiàn)CRC校驗(yàn)
一、實(shí)驗(yàn)?zāi)康?/p>
⒈通過學(xué)習(xí)CRC原理,驗(yàn)證,檢錯(cuò),掌握其工作原理;⒉編寫CRC編碼程序;
⒊總結(jié)實(shí)驗(yàn)過程,編寫提交實(shí)驗(yàn)報(bào)告:方案、編程、調(diào)試、結(jié)果、分析、結(jié)論。二、實(shí)驗(yàn)要求
用單片機(jī)實(shí)現(xiàn)CRC校驗(yàn)碼(10比特?cái)?shù)據(jù)或任意數(shù)據(jù)長度、生成多項(xiàng)式用G(x)=x5+x4+x2+1),校驗(yàn)碼顯示在單片機(jī)實(shí)驗(yàn)系統(tǒng)數(shù)碼管上。二、實(shí)驗(yàn)器材
1、裝有KeilC51開發(fā)工具的PC機(jī)一臺(tái)
2、TD-PIT/TD-PIT-B實(shí)驗(yàn)裝置一套
三、實(shí)驗(yàn)原理
1.設(shè)置CRC寄存器,并給其賦初始值。
2.將數(shù)據(jù)的第一個(gè)8-bit字符與16位CRC寄存器的低8位進(jìn)行異或,并把結(jié)果存入CRC寄存器。
3.CRC寄存器向右移一位,最高位補(bǔ)零,移出并檢查最低位。
4.如果LSB為0,重復(fù)第三步;若LSB為1,CRC寄存器與多項(xiàng)式碼相異或。5.重復(fù)第3與第4步直到8次移位全部完成。此時(shí)一個(gè)8-bit數(shù)據(jù)處理完畢。6.重復(fù)第2至第5步直到所有數(shù)據(jù)全部處理完成。
7.最終CRC寄存器的內(nèi)容即為CRC值。常用的CRC循環(huán)冗余校驗(yàn)標(biāo)準(zhǔn)多項(xiàng)式如下:CRC(12位)=X12+X11+X3+X2+X+1CRC(16位)=X16+X15+X2+1CRC(CCITT)=X16+X12+X5+1CRC(32位)=X32+X26+X23+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1以CRC(16位)多項(xiàng)式為例,其對(duì)應(yīng)校驗(yàn)二進(jìn)制位列為11000000000000101本次實(shí)驗(yàn)以10比特為例。顯示到六位數(shù)碼管中。
其實(shí)驗(yàn)連接圖如下圖所示。四、實(shí)驗(yàn)步驟
1.打開KeilC51開發(fā)工具,新建開發(fā)工具,并保存至相應(yīng)路徑。2.新建文件,編寫代碼。
3.按照實(shí)驗(yàn)連線圖在實(shí)驗(yàn)箱上連線。
4.編譯運(yùn)行代碼勿誤后,打開實(shí)驗(yàn)箱,點(diǎn)擊調(diào)試,運(yùn)行。
五、實(shí)驗(yàn)結(jié)果
經(jīng)過調(diào)試程序,在實(shí)驗(yàn)箱數(shù)碼管上顯示二進(jìn)制數(shù)001110.
六、實(shí)驗(yàn)源代碼#include"Absacc.h"
#defineC8255_AXBYTE[0x7F00]//8255端口地址定義#defineC8255_BXBYTE[0x7F01]#defineC8255_CXBYTE[0x7F02]#defineC8255_CONXBYTE[0x7F03]//數(shù)碼管顯示編號(hào)
unsignedchara[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedcharb[]={0x00,0x00,0x00,0x00,0x00,0x00};longMD;longGD;
voiddelay(unsignedinttime){unsignedinti;for(i=0;i
C8255_B=a[b[i]];//查表輸出顯示C8255_A=j;delay(0x100);j=(j>>1)|(j=1;MD=tmp;
tmp=GD;//數(shù)GD有多少位tmp用于暫存GDfor(count_GD=0;GD!=0;count_GD++)GD>>=1;GD=tmp;
//構(gòu)造CRC碼序列
for(tmp=1;tmp
{if(tst0==(tst0&MD))//MD與最高位為1當(dāng)除不盡時(shí)最高位為0,
//余數(shù)比除數(shù)少一位
{MD^=GD;//異或除法,被除數(shù)應(yīng)該異或之后少一位}
tst0>>=1;//位數(shù)減一,最高位降低一位
GD>>=1;//除數(shù)保持和被除數(shù)最高位對(duì)齊,相當(dāng)于豎式除法左對(duì)齊}i=0;
while(1)//轉(zhuǎn)化為2進(jìn)制輸出,16進(jìn)制數(shù)模2取余,移位{b[i]=MD%2;i++;MD/=2;if(MD==0||i>6)break;}}
voidmain(){
C8255_CON=0x81;//8255初始化CRC_check(0x28D,0x35);//16進(jìn)制
while(1)//顯示{
display();delay(0x80);clear();
}}七、實(shí)驗(yàn)心得
實(shí)驗(yàn)指導(dǎo)書上寫的還是很好懂,只是最初接觸的時(shí)候確實(shí)感覺代碼好多陌生,因?yàn)檫@個(gè)調(diào)用機(jī)制,變量基本上都是公有變量,直接在函數(shù)里面使用,賦值,在另一個(gè)函數(shù)里面接著用?雌饋砗瘮(shù)都是無參和無返回值的。不過后來仔細(xì)看了之后發(fā)現(xiàn)這個(gè)了之后,使用起來還是蠻順手的了。雖然還是習(xí)慣使用帶參數(shù)的函數(shù),但是不用寫返回值這一點(diǎn)倒也能適應(yīng)。在除法實(shí)現(xiàn)方面,通過百度找到了一種模擬豎式除法的方式,左對(duì)齊,異或,根據(jù)結(jié)果商數(shù),再左對(duì)齊,異或。如此就采用了除數(shù)與被除數(shù)位數(shù)對(duì)齊,除數(shù)不足位數(shù)補(bǔ)0的方式,因?yàn)?與任何數(shù)異或還是它本身,所以用0補(bǔ)足之后,除數(shù)和被除數(shù)整體異或的結(jié)果和豎式除法左對(duì)齊異或的結(jié)果是一樣的。M位除以N位,每次異或之后結(jié)果會(huì)降低一位,最終會(huì)得到M-N+1位商和N-1位余數(shù)或者0余數(shù)。
友情提示:本文中關(guān)于《CRC校驗(yàn)最終個(gè)人總結(jié)》給出的范例僅供您參考拓展思維使用,CRC校驗(yàn)最終個(gè)人總結(jié):該篇文章建議您自主創(chuàng)作。
來源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問題,請(qǐng)聯(lián)系我們及時(shí)刪除。