CRC-16公式是什么?如何利用单片机去验证呢

描述

一、实验目的

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复杂多了,这是现在最大的感触。但是我想至少能读懂,能写一些,然后每次多会一点知识就好。还是要加油。


审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分