一、實(shí)驗(yàn)?zāi)康?/p>
1、完成CRC-16的程序編寫
2、根據(jù)模板整改,實(shí)現(xiàn)函數(shù)調(diào)用
3、在程序中不可以出現(xiàn)長(zhǎng)數(shù)組
4、利用單片機(jī)驗(yàn)證
二、CRC-16校驗(yàn)
CRC-16公式是什么?
上堂課提到了哦!
再來(lái)看看框圖是什么樣子?
每個(gè)小框都是一個(gè)寄存器
CRC即循環(huán)冗余校驗(yàn)碼(Cyclic Redundancy Check):是數(shù)據(jù)通信領(lǐng)域中最常用的一種差錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長(zhǎng)度可以任意選定。
生成步驟如下:
1、將x的最高次冪為R的生成多項(xiàng)式G(x)轉(zhuǎn)換成對(duì)應(yīng)的R+1位二進(jìn)制數(shù)。
2、將信息碼左移R位,相當(dāng)于對(duì)應(yīng)的信息多項(xiàng)式C(x)*x的R次方。
3、用生成多項(xiàng)式(二進(jìn)制數(shù))對(duì)信息碼做除,得到R位的余數(shù)。
4、將余數(shù)拼到信息碼左移后空出的位置,得到完整的CRC碼。
三、實(shí)驗(yàn)程序
1、調(diào)用函數(shù)
這里完成的是寄存器生成法,同樣的根據(jù)模板,主要的是調(diào)用函數(shù)的編寫。
調(diào)用函數(shù)首先要進(jìn)行調(diào)用函數(shù)名的定義
function z = crc16(message)
接下來(lái)是寄存器的編寫,一開始寄存器的初始值都為0,為了程序的簡(jiǎn)明,根據(jù)實(shí)驗(yàn)要求不可以出現(xiàn)長(zhǎng)數(shù)組,只能出現(xiàn)一個(gè)數(shù)組。
a=zeros(1,16)
zeros函數(shù)是全零矩陣,所以滿足要求。
根據(jù)公式和框圖就可直接寫出每個(gè)寄存器的等式,這時(shí)候就要注意框圖中的箭頭方向,最重要的是要在最前面先定義第一個(gè)寄存器。
第一個(gè)寄存器里的數(shù)據(jù)是第十六個(gè)寄存器和輸入數(shù)據(jù)的第一個(gè)值的異或,尤為關(guān)鍵。后面的編寫就比較簡(jiǎn)單,只要注意一一對(duì)應(yīng)就好。同時(shí)crc是一個(gè)循環(huán)碼,這里就要使用for循環(huán)。循環(huán)的次數(shù)由輸入比特?cái)?shù)決定。
函數(shù)的最后還要把完整的寄存器寫上。
z=[a(16),a(15),a(14),a(13),a(12),a(11),a(10),a(9),a(8),a(7),a(6),a(5),a(4),a(3),a(2),a(1)];
2、主函數(shù)
在寫主函數(shù)之前先要把調(diào)用的函數(shù)寫上,后面的程序才能夠使用。
在這里應(yīng)用的是randi函數(shù)
randi是matlab中能產(chǎn)生均勻分布的偽隨機(jī)整數(shù)的新函數(shù)。
主要語(yǔ)法:
randi(iMax)在開區(qū)間(0,iMax)生成均勻分布的偽隨機(jī)整數(shù)
randi(iMax,m,n)在開區(qū)間(0,iMax)生成m*n型隨機(jī)矩陣
randi([iMin,iMax],m,n)在開區(qū)間(iMin,iMax)生成m*n型隨機(jī)矩陣
相似的還有rand函數(shù)和randn。
rand 生成均勻分布的偽隨機(jī)數(shù)。分布在(0~1)之間
主要語(yǔ)法:
rand(m,n)生成m行n列的均勻分布的偽隨機(jī)數(shù)
rand(m,n,'double')生成指定精度的均勻分布的偽隨機(jī)數(shù),參數(shù)還可以是'single'
rand(RandStream,m,n)利用指定的RandStream(我理解為隨機(jī)種子)生成偽隨機(jī)數(shù)
randn 生成標(biāo)準(zhǔn)正態(tài)分布的偽隨機(jī)數(shù)(均值為0,方差為1)主要語(yǔ)法和rand函數(shù)一致。
dec2hex函數(shù)
功能:把一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換成一個(gè)字符串形式表示的十六進(jìn)制數(shù)。
語(yǔ)法格式:
str = dec2hex(d)把十進(jìn)制整數(shù)d轉(zhuǎn)換成16進(jìn)制形式表示, 并存在一個(gè)字符串中。d必須是一個(gè)非負(fù)的比2^52次方小的整數(shù)。
str = dec2hex(d, n)指定十六進(jìn)制數(shù)的位數(shù),n就是指定的位數(shù)例如:dec2hex(255)ans =FF;dec2hex(255, 6)ans =0000FF
之后的程序就是將生成的數(shù)據(jù)寫入指定的文件里面。
data_hex = dec2hex(data_16);
fid = fopen('data_hex.txt', 'wt');
fprintf(fid, '%s ', data_hex);
fclose(fid);
data_binary1=dec2bin(data_binary);
fid = fopen('data_bin.txt', 'wt');
fprintf(fid, '%s ', data_binary1);
fclose(fid);
result_hex = dec2hex(result_16);
fid = fopen('result_hex.txt', 'wt');
fprintf(fid, '%s ', result_hex);
fclose(fid);
3、單片機(jī)驗(yàn)證
單片機(jī)是利用串口接收數(shù)據(jù),處理后回傳給電腦。
在MATLAB里直接寫入1011001001011010,則有data_bin文件的1011001001011010,data_hex文件的B25A,result_hex文件的83D0。
傳入單片機(jī)的數(shù)據(jù)是data_bin文件中的,相關(guān)的數(shù)據(jù)在單片機(jī)里進(jìn)行運(yùn)算,得到的如下圖所示。
MATLAB數(shù)據(jù)結(jié)果!
兩者的數(shù)據(jù)相同,也就驗(yàn)證了CRC校驗(yàn)程序正確。
小結(jié):現(xiàn)在MATLAB程序已經(jīng)能夠熟練應(yīng)用了,就是要多做才能熟練。但是單片機(jī)這塊還是挺薄弱的,能夠讀懂程序但是不能完整的獨(dú)立編寫。單片機(jī)比MATLAB復(fù)雜多了,這是現(xiàn)在最大的感觸。但是我想至少能讀懂,能寫一些,然后每次多會(huì)一點(diǎn)知識(shí)就好。還是要加油。
審核編輯:劉清
-
單片機(jī)
+關(guān)注
關(guān)注
6039文章
44583瀏覽量
636526 -
matlab
+關(guān)注
關(guān)注
185文章
2979瀏覽量
230662 -
寄存器
+關(guān)注
關(guān)注
31文章
5357瀏覽量
120693 -
CRC-16
+關(guān)注
關(guān)注
0文章
5瀏覽量
7546
原文標(biāo)題:計(jì)算機(jī)通信與網(wǎng)絡(luò)v2 實(shí)驗(yàn)課程(9)
文章出處:【微信號(hào):gh_30373fc74387,微信公眾號(hào):通信工程師專輯】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論