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