CRC校验实验报告

合集下载

CRC检验码实验报告

CRC检验码实验报告

CRC 检验码实验报告一 实验题目(1) 实现CRC 的校验过程,生成多项式为CRC12,要求设计简单的图形界面。

(2) 完成内容包括:输入发送数据序列,根据生成多项式完成余数计算,输出带有校验码的发送数据序列。

模拟正确发送、出现离散的一位错、离散的两位错以及长度小于12的突发错,给出相应的输出。

二 实验工具及环境实验语言:JAVA 实验工具:eclipese 三 实验思路 (1) 实验原理CRC 校验码的编码方法是用待发送的二进制数据t(x)移位生成多项式位数,其结果r(x)除以生成 多项式g(x),将最后的余数与上r(x)作为CRC 校验码。

(2) 实验思路 1.实现过程分实验类图2.计算CRC 检验码:1)用户输入发送数据比特序列A;2)默认为12位CRC 生成多项式,用户可根据需要自行修改CRC 生成多项式B; 3)根据B 的位数,对A 进行左移位相应的位数(相当于做2^n 的乘积运算),形成C;实现计算CRC 校验码与实现模拟出错的算法类选择应用主界面类,包括模拟CRC 出错与计算CRC 校验计算CRC 校验码界面模拟CRC 出错4)对生成多项式和发送数据流进行异或运算,计算余数D;5)余数D+C就形成了带有CRC检验码的数据比特序列。

3. CRC检验码出错模拟:用户输入原CRC检验码的数据比特序列A,选择待模拟的错误类型;程序给出相应模拟出错结果。

四实验结论1.优点1)实现了多种生成多项式CRC检验码的生成与检验2)检验与计算分开,功能明确3)可对用户输入数据进行检查,动态交互2.缺点1)在检验CRC校验码时,只能有用户手动输入数据,不能粘贴复制,比较麻烦2)页面布局与外观有待提高。

CRC校验

CRC校验

CRC校验引言:随着技术的不断进步,各种数据通信的应用越来越广泛。

由于传输距离、现场状况、干扰等诸多因素的影响,设备之间的通信数据常会发生一些无法预测的错误。

为了降低错误所带来的影响,一般在通信时采用数据校验的办法,而循环冗余码校验是常用的重要校验方法之一。

AVR高速嵌入式单片机是8位RISC MCU,执行大多数指令只需一个时钟周期,速度快(8MHz AVR的运行速度约等于200MHz 80C51的运行速度),32个通用寄存器直接与ALU相连,消除了运算瓶颈;内嵌可串行下载或自我编程的Flash和EPPROM,功能繁多,具有多种运行模式。

本文采用Atmel公司的Atmega128高速嵌入式单片机,依照IEEE 1999年公布的802.11无线局域网协议标准,采用32位循环冗余校验码(Cyclic Redundancy Check)实现无线传输数据时的差错校验。

1 CRC循环冗余校验码原理1.1 数据传输的帧格式根据IEEE制定的802.11无线局域网络协议,在数据传输时都应按照帧传输。

这里,我们采用了信息处理系统-数据通信-高级数据链路控制规程-帧结构,它的每个帧由下列字段组成(传输顺序自左至右):地址——数据站地址字段;控制——控制字段。

信息——信息字段;CRC校验位——根据前面三个字段生成的CRC校验位。

由地址、控制、信息三个字段组成的总的字段统称为数据段。

1.2 CRC校验码的理论生成方法CRC校验采用多项式编码方法,被处理的数据块可以看作是一个n阶的二进制多项式。

这里,假定待发送的二进制数据段为g(x),生成多项式为 m(x),得到的CRC校验码为c(x)。

CRC校验码的编码方法是用待发送的二进制数据g(x)除以生成多项式m(x),将最后的余数作为CRC校验码,实现步骤如下。

① 设待发送的数据块是m位的二进制多项式 g(x),生成多项式为r阶的m(x)。

在数据块的末尾添加r个0,数据块的长度增加到m+r 位,对应的二进制多项式为G(x) 。

CRC编码实验实验报告

CRC编码实验实验报告
循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较, 若两个CRC值不同,则说明数据通讯出现错误。
11001———————除数
————
11110
1001
————
11111
11001
————
000100——————余数
2)
input=[1 0 1 1 0 0 1 1];crc_no=4;
k = size(input,2);
generator = zeros(1,crc_no+1);
output = zeros(1,k+crc_no);
end
output = [input output(1:crc_no)];
n = size(input,2);
output = input(1:n-crc_no);
forii = 1:n-crc_no
if(input(1) == 1)
input(1:crc_no+1) = mod((input(1:crc_no+1)+generator),2);
而发送信息位 1111,可转换为数据多项式为C(x)=x^3+x^2+x+1。
2)、生成多项式
是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。

数据通信与计算机网络实验:CRC校验

数据通信与计算机网络实验:CRC校验

实验2:CRC冗余循环校验码实验目的1.了解信道编码在通信系统中的重要性;2.掌握CRC循环码编译码的原理;3.掌握CRC循环码检错纠错原理;实验原理1.实验原理框图2.框图说明:循环码编码过程:数字终端的信号经过串并变换后,进行分组,分组后的数据再经过循环码编码,数据由4bit变为7bit。

实验内容一、循环码编码规则验证通过改变输入数字信号的码型,观测延时输出,编码输出以及译码输出,验证循环码编译码规则,并对比汉明码编码规则有何异同。

1.关电,按表格所示进行连线。

2.开电,设置主控菜单,选择【主菜单】→【通信原理】→【循环码】。

(1)将2号模块的拨码开关S12#拨为10100000,拨码开关S22#、S32#、S42#均拨为00000000。

(2)将6号模块的拨码开关S16#拨为0010,即编码方式为循环码。

拨码开关S36#拨为0000,即无错模式。

按下S26#系统复位键。

3.此时系统初始状态为:2号模块提供32K编码输入数据,6号模块进行循环编译码,无差错插入模式。

4.实验操作及波形观测。

(1)用示波器观测TH5处编码输出波形。

注:为方便观测,可以以TH4处延时输出作为输出编码波形的对比观测点。

此处观测的两个波形是同步的。

(2)拨动拨码开关S1前四位观测编码输出并填入下表中:二、循环码检纠错性能检验1. 将6号模块S3按照插错控制表中的拨码方式,逐一插入不同错误,按下6号模块S2系统复位。

重复步骤3~4,验证循环码的检纠错能力。

2. 将示波器触发源通道接TP2帧同步信号,示波器另一个通道接TP1插错指示,可以观测插错位置。

三、实验报告常用的G(3)生成多项式有:G(X)=X3+X2+1 G(X)=X3+X+1 G(X)=X3+11、根据实验测试记录,完成实验表格;2、结合实验波形分析实验电路的工作原理,简述其工作过程;3、分析循环码实现检错及纠错的原理。

循环冗余校验编解码电路设计实验报告

循环冗余校验编解码电路设计实验报告

循环冗余校验编解码电路设计实验报告一、引言循环冗余校验(CRC)是一种常用于检测和校正数据传输错误的技术。

在通信领域,CRC编解码电路是一种重要的硬件设计,用于验证数据传输的准确性。

本实验旨在通过设计循环冗余校验编解码电路,探索其工作原理和实际应用。

二、背景知识1.循环冗余校验原理循环冗余校验利用多项式除法的性质来实现数据校验。

发送端将数据和校验值进行运算得到余数,并将余数附加到数据后一起发送。

接收端通过对接收到的数据进行除法运算,得到的余数判断数据是否正确。

2.CRC编码过程–发送端:将数据进行扩展,加上用于校验的位数,并使用预定的生成多项式进行除法运算得到余数,将余数附加在数据后面发送出去。

–接收端:接收到数据后,再次进行除法运算,得到的余数为0则说明数据传输正确,否则说明存在错误。

3.CRC解码过程–发送端:发送数据和余数。

–接收端:接收数据和余数,使用与发送端一样的生成多项式进行除法运算,得到的余数判断数据是否正确。

三、实验设计与实现1. 实验目的了解循环冗余校验的原理,并通过设计和实现循环冗余校验编解码电路加深对其理解。

2. 实验器材与材料•FPGA开发板:用于搭建实验电路•Vivado软件:用于设计和验证电路•扁平电缆:用于连接FPGA开发板和外部设备3. 实验步骤1.了解所用的生成多项式,确定校验位数和除法运算方式。

2.使用Vivado软件创建工程,选择适合的FPGA开发板型号。

3.设计循环冗余校验编码模块,并使用Verilog语言进行描述。

4.设计循环冗余校验解码模块,并使用Verilog语言进行描述。

5.设计测试模块,用于生成测试数据和验证结果。

6.进行RTL级仿真,验证电路设计的正确性。

7.将设计文件综合、实现和下载到FPGA开发板。

8.在FPGA开发板上测试编解码电路的功能和性能。

9.分析实验结果,总结经验和教训。

四、实验结果与分析1. RTL级仿真结果在RTL级仿真中,我们生成了不同的输入数据,并通过编解码电路计算得到校验值和余数。

实验三 CRC校验

实验三 CRC校验

实验三
1、实验题目:CRC校验
PPP协议受到数据帧后要对数据部分连同FCS字段做CRC校验,结果若不为“0”,则可以肯定数据在传输过程中出错;结果若为“0”,则只能说明很大概率上数据在传输的过程中没有出错,而不是百分之百不出错。

这个概率与CRC校验时采用的除数有关,我们把使用某个除数做CRC校验,结果为“0”且数据实际不出错的概率称为该除数的有效性。

本次试验要求同学们以实验的方法验证CRC-16的有效性。

2、实验内容:
(1)随机取1个128位数A。

(2)将A与CRC-16做除法得余数B,A*216+B保存在C中。

(3)随机修改C中的1个比特,重新与CRC-16做除法运算,记录余数为0的二进制组合。

(4)随机修改C中的2个比特,重新与CRC-16做除法运算,记录余数为0的二进制组合。

(5)随机修改C中的3个比特,重新与CRC-16做除法运算,记录余数为0的二进制组合。

3、实验报告内容:
(1)CRC校验原理。

(2)实验记录
(3)随机产生的128位数(以16进制表示)。

(4)除法运算的算法描述。

(5)随机修改C中的1个比特,重新与CRC-16做除法运算,余数为0的二进制组合。

(6)随机修改C中的2个比特,重新与CRC-16做除法运算,余数为0的二进制组合。

(7)随机修改C中的3个比特,重新与CRC-16做除法运算,余数为0的二进制组合。

4、实验结果分析:
理论上CRC-16的有效性(不一定100%有效)。

CRC实验报告 2011-06-16

CRC实验报告 2011-06-16

数电实验报告题目 CRC校验原理仿真实验班级 29001040班姓名刘奎学号 2903003015 时间 2011年5月25日地点英才实验学院创新实验室指导教师李尚泽摘要本实验利用循环校验码(CRC)校验原理通过对通信系统发射端的原始数据生成CRC校验位,并按照RS-232的传输协议组帧,在传输过程中加入随机的噪声,在接收端对RS-232传输帧格式进行解析,并完成CRC校验。

整个过程在Modelsim上仿真实现。

关键词CRC校验仿真目录第一章实验原理与任务 (2)第二章设计思路、方法及方案 (3)第三章 FPGA模块程序设计与仿真 (3)第四章结束语 (4)附录 (4)第一章 实验任务与原理1、任务指标利用VHDL 完成16比特CRC 校验程序的设计,并能利用modelsim 仿真得到电路的时序波形。

2、实验要求在了解CRC 校验原理的前提下,在发送端对原始数据生成CRC 校验位,并按照RS-232的传输协议组帧,在接收端对RS-232传输帧格式进行解析,并完成CRC 校验。

整个过程在Modelsim 上仿真实现。

3、原理阐述循环校验码(CRC )是数据通信领域中常用的一种差错校验码,其特点是信息字段和校验字段的长度可以任意选定。

生成CRC 校验码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’或‘1’的多项式一一对应,例如‘1010111’对应的多项式为6421x x x x ++++。

CRC 码集选择的原则:若设码字长度为N ,信息字段长度为K ,校验字段长度为R ,则N=K+R ;对于CRC 码集中的任一码字,存在且仅存在一个R 次多项式g(x)使得:()()()()()RV x A x g x x m x r x ==+其中m(x)为K 次信息多项式,r(x)为R-1次校验多项式,g(x)称为生成多项式。

V(x)为发送的信息加码字多项式。

2012()...RR g x g g x g x g x=++++发送方通过指定的g(x)产生CRC 码字,接收方则通过g(x)来验证CRC 码字,若传输码字多项式V(x)能除尽g(x),则传输正确。

实验三 循环冗余码效验(CRC)

实验三  循环冗余码效验(CRC)

实验三循环冗余码效验(CRC)
一、实验目的
熟悉和学习ISO/IEC18000-3,ISO15693标准规范第三部分协议,其中贯串所有指令部分CRC的内容,特别是AnnexD的内容。

理解它的原理、流程和软件实验办法。

二、实验内容
通过使用带CRC处理过程的指令和不带CRC过程的指令读取单个标签,比较其指令的读取结果。

分析实验数据,了解CRC的作用,掌握指令的应该取得的结果。

三、实验原理
ISO15693标准规范第三部分下的AnnexD部分。

四、所需仪器
供电电源、单张电子标签。

五、实验步骤
1、设置
加电运行系统,在系统的天线内放置多个标签,打开软件Tag-reader.exe.正确设置串门、操作如图
2、操作
2.1 带CRC命令操作
在系统软件下,“寻卡”处,选择“单卡识别”,确定“寻卡”动作。

操作如图所示:
清空数据,在系统软件下,“测试命令”处,选择运行“测试循环冗余校验码”,选择“发送带循环冗余校验的寻卡命令”,操作如图:
2.2不带CRC命令操作
清空数据,选择“发送不带循环冗余校验的寻卡命令”,操作如图:。

CRC校验码编码实验

CRC校验码编码实验

实验四CRC校验码编码实验班级:电子C073 姓名:赵宣学号:075584一、实验目的1、复习C++语言基本编写方法,熟悉面向对象编程方法。

2、学习CRC编码基本流程, 学会调试循环冗余校验码编码程序。

3、根据给出资料,掌握CRC校验码的编码原理,重点掌握按字节(Byte)编码方法二、实验内容与原理(一)实验原理:1. CRC 校验码介绍CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的监督码(CRC 码)r 位,并附在信息后边,构成一个新的二进制码序列数共 (k+r) 位,最后发送出去。

在接收端,则根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。

16 位的CRC 码产生的规则是先将要发送的二进制序列数左移16 位(乘以216)后,再除以一个多项式,最后所得到的余数既是CRC 码。

求CRC 码所采用模2 加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。

接收方将接收到的二进制序列数(包括信息码和CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误。

2.按位计算CRC一个二进制序列数可以表示为求此二进制序列数的CRC 码时,先乘以216后(左移16位),再除以多项式G(X) ,所得的余数就是所要求的CRC 码。

可以设:其中Q n (X) 为整数, R n (X) 为16位二进制余数,将上式代入前式得:再设:其中Qn-1(X) 为整数, Rn-1(X) 为16位二进制余数,继续代入前式,多次迭代得到:根据CRC 的定义,很显然,十六位二进制数R0(X) 即是要求的CRC 码。

3.按字节计算CRC对于一个二进制序列数可以按字节表示为下式,其中Bn(X) 为一个字节(共8位):求此二进制序列数的CRC码时,先乘以216后(左移16位),再除以多项式G(X),所得的余数即是所要求的CRC 码。

循环冗余校验编解码电路设计实验报告

循环冗余校验编解码电路设计实验报告

循环冗余校验编解码电路设计实验报告在数字通信领域中,循环冗余校验(CRC)是一种常用的错误检测和纠正技术。

通过在数据中添加冗余校验位,接收方可以根据这些校验位检测出数据传输过程中是否发生了错误,并且还可以纠正部分错误。

本实验旨在设计一个循环冗余校验编解码电路,以验证CRC技术的可靠性和有效性。

一、实验背景循环冗余校验是一种基于多项式运算的错误检测和纠正技术,广泛应用于数据传输和存储系统中。

其原理是将数据视为多项式,并通过除法运算生成校验位,接收方根据收到的数据和校验位再次进行除法运算,以验证数据的完整性。

CRC技术具有高效性和低成本的优点,因此在现代通信系统中得到了广泛应用。

二、实验设计设计一个基于CRC技术的编解码电路,包括数据发送端和数据接收端两部分。

在发送端,将数据和校验位进行拼接,并通过CRC生成多项式进行运算,得到最终的发送数据。

在接收端,接收到数据后,同样进行CRC多项式运算,以验证数据的准确性,并在有错误时进行纠正。

通过实验验证CRC技术在数据传输中的可靠性和有效性。

三、实验步骤1. 确定CRC生成多项式和初始寄存器值。

2. 在发送端,将数据和校验位进行拼接,并进行CRC多项式运算。

3. 发送带有校验位的数据。

4. 在接收端,接收数据后,进行CRC多项式运算,验证数据的准确性。

5. 如果有错误发生,进行纠正操作。

6. 测试不同数据长度和错误位情况下的CRC编解码性能。

四、实验结果经过多次实验,我们验证了设计的CRC编解码电路的可靠性和有效性。

在大多数情况下,CRC技术能够有效检测和纠正数据传输中的错误,提高了数据传输的可靠性和稳定性。

同时,我们也发现CRC 技术在处理大量数据时,能够快速进行校验,减少了传输延迟。

五、结论通过本次实验,我们深入了解了循环冗余校验技术的原理和应用,设计并验证了一个CRC编解码电路,证明了CRC技术在数据传输中的重要性和有效性。

CRC技术不仅可以检测和纠正数据传输中的错误,还可以提高数据传输的稳定性和可靠性,为数字通信系统的发展提供了重要支持。

crc校验实验报告python代码

crc校验实验报告python代码

crc校验实验报告python代码标题:CRC校验实验报告:Python代码实现与解析一、引言CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用在数据通信和存储系统中的错误检测码。

其基本原理是通过在原始数据后添加一个特定的校验码,然后在接收端再次计算并比较这个校验码,以此来判断数据在传输过程中是否发生了错误。

本实验报告将详细阐述如何使用Python语言实现CRC校验,并通过具体的代码示例进行解析。

二、CRC校验原理CRC校验的基本思想是将待校验的数据看作是一个大数,然后用这个大数除以一个预设的除数,得到的余数就是CRC校验码。

在接收端,同样的操作被执行,如果得到的余数为0,则认为数据在传输过程中没有发生错误。

三、Python代码实现以下是一个简单的Python代码实现CRC校验的例子:pythondef crc8(data):polynomial = 0x07 # 使用0x07作为生成多项式crc = 0x00 # 初始化CRC值为0for byte in data:crc ^= byte # XOR当前字节与CRC值for _ in range(8): # 对每个位进行处理if crc & 0x80: # 如果最高位为1crc = (crc << 1) ^ polynomial # 左移一位并异或生成多项式else:crc <<= 1 # 否则只左移一位crc &= 0xFF # 保留8位return crcdata = b"Hello, World!" # 待校验的数据checksum = crc8(data) # 计算CRC校验码print("CRC8 Checksum:", hex(checksum)) # 输出CRC校验码四、代码解析1. 定义CRC函数`crc8`,输入参数为待校验的数据。

网络实验报告 crc

网络实验报告 crc
完成此项实验,完成实验报告。
【实验组织方式】
个人实验
【实验条件】
微机与编程软件。
五.实验步骤
1.基础理论知识
CRC检错方法的工作原理是:将要发送的数据比特序列当做一个多项式f(x)的系数,在发送端用收发双方预先约定的生成多项式G(x)去除,求得一个余数多项式。将余数多项式加到数据多项式后发送到接收端。在接收端,用同样的生成多项式G(x)去除接收数据多项式f’(x),得到计算余数多项式。如果计算余数多项式与接收余数多项式相同,表示传输无差错;否则,表示传输有差错,由发送方重发数据,直至正确为止。
}
UpdateData(FALSE);
}
七.结果分析
图1
图2




教师签名:
年月日
⑵f(x)=1100001101, G(x)=x^16+x^15+x^2+1
CRC校验码的生成过程:
①发送数据比特序列为1100001101。
②生成多项式比特序列为11000000000000101。
③将发送数据比特序列乘以216,那么产应为生的乘积11000011010000000000000000。
④将乘积用生成多项式比特序列去除,求得余数比特序列为110010111000。
⑤将余数比特序列加到乘积中,得10001101000000110010111000。
⑥如果在数据传输过程中没有发生错误,接收端收到的带有CRC校验码的数据比特序列一定能被相同的生成多项式整除,即余数等于0。说明数据传输正确。
调试的步骤:
保存为c或c++文件。
根据断点调试找到错误处。
采用F10或F11单步调试找到精确的错误处。其中f10是跳过函数调用,F11是进入函数体调试。一般是先用F10,确定函数输入输出是否正确(与自己想的一样),如不一样,则用F11进入函数体一步一步调试。

单片机crc校验实验报告

单片机crc校验实验报告

单片机课程总实验——实现CRC校验一、实验目的⒈通过学习CRC原理,验证,检错,掌握其工作原理;⒉编写CRC编码程序;⒊总结实验过程,编写提交实验报告:方案、编程、调试、结果、分析、结论。

二、实验要求用单片机实现CRC校验码(10比特数据或任意数据长度、生成多项式用G (x)= x5 + x4 + x2 + 1 ),校验码显示在单片机实验系统数码管上。

二、实验器材1、装有Keil C51开发工具的PC机一台2、TD-PIT/TD-PIT-B实验装置一套三、实验原理1.设置CRC寄存器,并给其赋初始值。

2.将数据的第一个8-bit 字符与16 位CRC 寄存器的低8 位进行异或,并把结果存入CRC寄存器。

3.CRC 寄存器向右移一位,最高位补零,移出并检查最低位。

4.如果LSB 为0,重复第三步;若LSB 为1,CRC 寄存器与多项式码相异或。

5.重复第 3 与第4 步直到8 次移位全部完成。

此时一个8-bit 数据处理完毕。

6.重复第 2 至第5 步直到所有数据全部处理完成。

7.最终CRC 寄存器的内容即为CRC 值。

常用的CRC循环冗余校验标准多项式如下:CRC (12 位) =X12+X11+X3+X2+X+1 CRC (16 位) = X16+X15+X2+1CRC (CCITT) = X16+X12 +X5+1 CRC (32 位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+ X5+X4+X2+X+1 以CRC (16 位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101本次实验以10比特为例。

显示到六位数码管中。

其实验连接图如下图所示。

四、实验步骤1.打开Keil C51开发工具,新建开发工具,并保存至相应路径。

2.新建文件,编写代码。

3.按照实验连线图在实验箱上连线。

4.编译运行代码勿误后,打开实验箱,点击调试,运行。

五、实验结果经过调试程序,在实验箱数码管上显示二进制数001110.六、实验源代码#include "Absacc.h"#define C8255_A XBYTE[0x7F00] //8255端口地址定义#define C8255_B XBYTE[0x7F01]#define C8255_C XBYTE[0x7F02]#define C8255_CON XBYTE[0x7F03]//数码管显示编号unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};long MD;long GD;void delay(unsigned int time){unsigned int i;for(i=0; i<time; i++);}void display() //显示函数{unsigned char i, j = 0xDF;for(i=0; i<6; i++){C8255_A = 0xFF;C8255_B = a[b[i]]; //查表输出显示C8255_A = j;delay(0x100);j = (j>>1)|(j<<7);}}void clear() //清屏{C8255_B = 0x00;}void CRC_check(long MD1,long GD1){ long MD = MD1 ; // 需要校验的数据long GD = GD1;long tmp; //临时变量保存多个移位,或恢复原值信息int count_MD; //校验数据的位数int count_GD; //多项式的位数int count; //两者位数差long tst0 = 1; //判断余数最高位是否为0int i;tmp = MD; //数MD 有多少位tmp用于暂存MDfor(count_MD = 0 ; MD != 0 ; count_MD++)MD >>= 1;MD = tmp;tmp = GD; //数GD有多少位tmp用于暂存GDfor(count_GD = 0 ; GD != 0 ; count_GD++)GD >>= 1;GD = tmp ;//构造CRC码序列for(tmp = 1 ; tmp < count_GD ; tmp ++) //左移count_GD-1位MD <<= 1;count = count_MD - 1;//将GD 与MD 构造等长,低位用0填充tmp = count; //长度均为count_GD+count_MD-1while(count--){GD <<= 1 ;}count = tmp;//tst0 和MD 求与运算,确定MD最高位是否为1,确定是否应该求模tmp = count_GD + count_MD -1 ;while(--tmp) //循环tmp-1次,位数为1+tmp-1tst0 <<= 1;//模二除法的实现for( ; count >= 0 ; count--){ if(tst0 == (tst0&MD)) //MD与最高位为1 当除不尽时最高位为0,//余数比除数少一位{MD ^= GD ; // 异或除法,被除数应该异或之后少一位}tst0 >>= 1; //位数减一,最高位降低一位GD >>= 1; //除数保持和被除数最高位对齐,相当于竖式除法左对齐}i=0;while(1) //转化为2进制输出,16进制数模2取余,移位 {b[i] = MD % 2;i++;MD /= 2;if(MD == 0 || i > 6)break;}}void main(){C8255_CON = 0x81; //8255初始化CRC_check(0x28D,0x35); //16进制while(1) //显示{display();delay(0x80);clear();}}七、实验心得实验指导书上写的还是很好懂,只是最初接触的时候确实感觉代码好多陌生,因为这个调用机制,变量基本上都是公有变量,直接在函数里面使用,赋值,在另一个函数里面接着用。

计算机网络技术CRC冗余码检验

计算机网络技术CRC冗余码检验

XXXX大学(计算机网络技术)实验报告实验名称CRC冗余码检验实验时间2011年03月30日专业姓名学号预习操作总评教师签名一.实验目的:掌握CRC冗余码校验的基本原理,编程实现CRC冗余码校验。

二.实验要求:在C++的MFC下来实现这一过程。

三.实验内容及运行结果:CRC—32(循环冗余错误校验)生成CRC—32校验字节的步骤如下:(1)装入一个32位寄存器,所有数位均为1。

(2)该32位寄存器的高位字节与开始8位字节进行“异或”运算。

运算结果放入这个32位寄存器。

(3)把这个32位寄存器向右移1位。

(4a)若向右(标记位)移出的数位是1,则生成多项式10100000000000001010000000000001和这个寄存器进行“异或”运算。

(4b)若向右移出的数位是0,则返回(3)。

(5)重复(3)和(4),直至移出8位。

(6)另外24位与该32位寄存器进行“异或”运算。

(7)重复(3)—(6),直至该报文所有字节均与32位寄存器进行“异或”运算,并移位24次。

(8)这个32位寄存器的内容即4字节CRC错误校验在C++下:文件新建—MFC AppWizard [exe]—创建的应用程序类型选择基本对话框—应用程序向导创建的类选择xxxDIg , 其它的属性默认系统设置。

在资源菜单下设置自己喜欢的界面。

添加相应参数,采用添加类的方式来完成。

对两个按钮的编写:void CCrcydcDlg::OnButton1(){UpdateData(true);int n,p,k,q,i,j=0;LPCSTR head,g,begain,str1,str3;CString strEdit=m_strEdit1,s=CString("01");n=strlen(m_strEdit3)-1;if( strlen(m_strEdit1)==0 && strlen(m_strEdit3)==0 ){MessageBox("没有输入数据!请重新填写!");return ;}if( strlen(m_strEdit1)==0 && strlen(m_strEdit3)!=0 ){MessageBox("没有输入要编码的数据!请重新填写!");return ;}if( strlen(m_strEdit1)!=0 && strlen(m_strEdit3)==0 ){MessageBox("没有输入校验多项式!请重新填写!");return ;}str1=m_strEdit1;str3=m_strEdit3;for(int I=0; (str1[I]=='0' || str1[I]=='1' ) && I < strlen(m_strEdit1) ;I++); if( I < strlen(m_strEdit1) ){ MessageBox("输入的要编码的数据不合理!请重新填写!");return ;}for(int J=0; (str3[J]=='0' || str3[J]=='1' ) && J < strlen(m_strEdit3) ;J++); if( J < strlen(m_strEdit3) ){ MessageBox("输入的校验多项式不合理!请重新填写!");return ;}for(k=n;k>0;k--)strEdit+=CString("0");strEdit=LPCSTR(strEdit);head = strEdit ;for( ; strlen( head ) >= strlen( m_strEdit3 ) ; ){g = m_strEdit3 ;for( i=0; *g != '\0' ; i++, g++ ){if( *(head+i) == *g )strEdit.SetAt(i+j,s[0]);//CString("0") ;elsestrEdit.SetAt(i+j,s[1]);//CString("1");}q=0;for( ; strEdit[q] != '1' && q < strlen(strEdit)-1 ; )q++ ;j = q ;head = strEdit ;head+=q;}p = strlen(strEdit)- n;begain = strEdit;begain += p;m_strEdit4=begain;m_strEdit5 = m_strEdit1 + m_strEdit4;UpdateData(false);}void CCrcydcDlg::OnButton2(){// TODO: Add your control notification handler code here OnCancel();}四.实验心得:……。

CRC校验码编码实验

CRC校验码编码实验

实验四CRC校验码编码实验班级:电子C073 姓名:赵宣学号:075584一、实验目的1、复习C++语言基本编写方法,熟悉面向对象编程方法。

2、学习CRC编码基本流程, 学会调试循环冗余校验码编码程序。

3、根据给出资料,掌握CRC校验码的编码原理,重点掌握按字节(Byte)编码方法二、实验内容与原理(一)实验原理:1. CRC 校验码介绍CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的监督码(CRC 码)r 位,并附在信息后边,构成一个新的二进制码序列数共 (k+r) 位,最后发送出去。

在接收端,则根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。

16 位的CRC 码产生的规则是先将要发送的二进制序列数左移16 位(乘以216)后,再除以一个多项式,最后所得到的余数既是CRC 码。

求CRC 码所采用模2 加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。

接收方将接收到的二进制序列数(包括信息码和CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误。

2.按位计算CRC一个二进制序列数可以表示为求此二进制序列数的CRC 码时,先乘以216后(左移16位),再除以多项式G(X) ,所得的余数就是所要求的CRC 码。

可以设:其中Q n (X) 为整数, R n (X) 为16位二进制余数,将上式代入前式得:再设:其中Qn-1(X) 为整数, Rn-1(X) 为16位二进制余数,继续代入前式,多次迭代得到:根据CRC 的定义,很显然,十六位二进制数R0(X) 即是要求的CRC 码。

3.按字节计算CRC对于一个二进制序列数可以按字节表示为下式,其中Bn(X) 为一个字节(共8位):求此二进制序列数的CRC码时,先乘以216后(左移16位),再除以多项式G(X),所得的余数即是所要求的CRC 码。

CRC校验实验报告

CRC校验实验报告

实验三CRC校验一、CRC校验码的基本原理编码过程:CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。

其实现步骤如下:1 设待发送的数据块是m位的二进制多项式t(x),生成多项式为r阶的g(x)。

在数据块的末尾添加r个0,数据块的长度增加到m+r位。

2 用生成多项式g(x)去除,求得余数为阶数为r-1的二进制多项式y(x)。

此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC校验码。

3 将y(x)的尾部加上校验码,得到二进制多项式。

就是包含了CRC校验码的待发送字符串。

解码过程:从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式所以解码时可以用接收到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。

许多CRC的硬件解码电路就是按这种方式进行检错的。

同时,可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。

解码过程示例:运行结果:附录(实现代码):using System;using System.Collections.Generic;using System.Text;namespace CRC{public abstract class Change{/// <summary>/// 字节数组转进制/// </summary>/// <param name="bytes">字节数组</param>/// <param name="b1">字节数组长度</param>public static string ByteToHex(byte[] bytes, int b1){string returnStr = "";if (bytes != null){for (int i = 0; i < b1; i++){returnStr += bytes[i].ToString("x2").ToUpper();} }return returnStr;}/// <summary>/// 16进制转字节数组/// </summary>/// <param name="hexStr">16进制数</param>public static byte[] HexToByte(string hexStr){hexStr = hexStr.Replace(" ", "");if ((hexStr.Length % 2) != 0)hexStr += " ";//空格byte[] bytes = new byte[hexStr.Length / 2];for (int i = 0; i < bytes.Length; i++){bytes[i] = Convert.ToByte(hexStr.Substring(i * 2, 2), 16);} return bytes;}/// <summary>/// 字符串转进制/// </summary>/// <param name="str">字符串</param>/// <returns></returns>public static string StrToHex(string str){if (str == "") return "";byte[] bTemp = System.Text.Encoding.Default.GetBytes(str);return ByteToHex(bTemp, bTemp.Length);}/// <summary>/// 16进制转字符串/// </summary>/// <param name="str">16进制</param>/// <returns></returns>public static string HexToStr(string str){byte[] bytes = new byte[str.Length];bytes = HexToByte(str);return Encoding.Default.GetString(bytes);}}}namespace CRC{//哈夫曼树150// 结点类Node的定义如下:public class Node{private int weight; //结点权值private int lChild; //左孩子结点private int rChild; //右孩子结点private int parent; //父结点//结点权值属性public int Weight{get{return weight;}set{weight = value;}}//左孩子结点属性public int LChild{get{return lChild;}set{lChild = value;}}//右孩子结点属性public int RChild{get{ return rChild;}set { rChild = value; } } //父结点属性public int Parent{ get{ return parent; }set {parent = value; } } //构造器public Node(){weight = 0;lChild = -1;rChild = -1; parent = -1; }//构造器public Node(int w, int lc, int rc, int p){weight = w;lChild = lc;rChild = rc;parent = p;}}public class HuffmanTree{private List<Node> data = new List<Node>(); //结点数组private int leafNum; //叶子结点数目//索引器public Node this[int index]{get{return data[index];}set{data[index] = value;}}//叶子结点数目属性public int LeafNumpublic int LeafNum{get{ return leafNum;set{ leafNum = value; } }//构造器public HuffmanTree(){ }public HuffmanTree(List<NumKindchar> m_NumKind){leafNum = m_NumKind.Count;for (int j = 0; j < 2 * m_NumKind.Count - 1; j++)//n中字符共需要2n-1个节点{Node databuff = new Node();if (j < this.leafNum){databuff.Weight = m_NumKind[j].num; }data.Add(databuff);//每创建一个节点将节点加入节点数组data当中} }public List<Node> Create(){int max1, max2, tmp1, tmp2;//处理n个叶子结点,建立哈夫曼树for (int i = 0; i < this.leafNum - 1; ++i){ max1 = max2 = Int32.MaxValue;tmp1 = tmp2 = 0;//在全部结点中找权值最小的两个结点for (int j = 0; j < this.leafNum + i; ++j){ if ((data[j].Weight < max1) && (data[j].Parent == -1)){ max2 = max1;tmp2 = tmp1;tmp1 = j;max1 = data[j].Weight; }else if ((data[j].Weight < max2) && (data[j].Parent == -1)){ max2 = data[j].Weight;tmp2 = j;} }data[tmp1].Parent = this.leafNum + i;data[tmp2].Parent = this.leafNum + i;data[this.leafNum + i].Weight = data[tmp1].Weight + data[tmp2].Weight;data[this.leafNum + i].LChild = tmp1;data[this.leafNum + i].RChild = tmp2;}return data; }}public class NumKindchar{ public char letter { get; set; }//字符public int num { get; set; }//字符出现的次数public List<bool> huffmancode { get; set; }//字符对应的huffman编码}public class codeChar{public char numChar { get; set; }public string codeCharater { get; set; }}}。

CRC校验实验

CRC校验实验

实验一、CRC校验实验一、实验目的1.熟悉西门子S7-200编程软件SETP7-Micro/WIN SP6的编程和调试方法。

2.掌握CRC校验的原理和在S7-200 PLC中的实现方法。

二、实验设备计算机、西门子S7-200 PLC、RS485编程下载线。

三、实验原理(一)CRC校验基本原理校验码的具体生成过程为:假设被传输的数据流为BYTE[n]BYTE[n-1].... BYTE[1]BYTE[0],将此数据流看成系数为0或1的多项式M(x)。

收发双方约定一个生成多项式G(x)。

本实验中,多项式设为G(x)= X8+X7+X2+1。

在发送端将M(x)所对应的位串左移8位后按模2除法除以G(x)所对应的位串,余数为8位,称为CRC校验码,将CRC校验码附加在被传输的数据流后边,则被传输的带校验码的数据流为BYTE[n]BYTE[n-1]....BYTE[1]BYTE[0]CRC。

在接收端,也进行同样的除法过程,如果接收端的除法结果不为0,则表明数据传输产生了差错,数据接收端自动请求重发,实现纠错。

(二)CRC校验码生成方法和步骤1. 将被传输的数据流左移8位(共n+2个字节),高8位BYTE[n])放入一个长度为8的寄存器。

2. 将寄存器左移1位(寄存器的最低位从下一个字节获得),如果移出位为1,将寄存器中的值与生成多项式G(x)的简记式进行异或运算,运算结果存回寄存器中。

G(x)对应的位串共9位,其最高位总是1,G(x)的简记式为其后8位,为10000101。

如果移出位为0,则仅将寄存器左移1位(寄存器的最低位从下一个字节获得)。

3. 重复第2步,直到扩展后的数据流(n+2个字节)全部移入寄存器。

4. 寄存器中的值则为CRC校验码。

四、实验内容1.根据CRC校验码生成原理编写一段程序,调试并要求能够实现正确计算出任意长度数据串的CRC校验码。

七、实验源程序Network 1LD SM0.0MOVW VW301,VW400 //被传输数据高16位送入16位寄存器MOVW 16#8005,VW100 //VW100中存入生成多项式MOVD &VB303,AC1 //被传输数据下一个字节的地址存入AC1MOVB *AC1,VB20 //VB303中的被传输数据第3个字节存入VB20MOVB VB300,VB10//VB300输数据流的字节数送入VB10Network 2LD SM0.0FOR VW2,1,VW9 //外循环次数为被传输数据的字节数VB10Network 3LD SM0.0FOR VW0,1,8 //内循环次数为8位Network 4LD SM0.0SHRB V20.7,V401.0,16 //将V303.7移入V401.0LD SM1.1XORW VW100,VW400Network 5LD SM0.0SLB VB20.1 //将VB20左移一位Network 6NEXTNetwork 7LD SM0.0INCB AC1MOVB *AC1,VB20 Network 8NEXT。

CRC实验报告

CRC实验报告

沈阳工程学院学生实验报告实验室名称:信息工程系软件实验室实验课程名称:计算机网络实验项目名称:CRC校验编程实现班级:软本094姓名:王诗娟陈志银刘云峰学号:02、10、14实验日期:2012年03月26日实验台编号:15 指导教师:郑秀颖批阅教师(签字):成绩:一.实验目的掌握并理解CRC校验算法,编程实现CRC。

二.实验内容1.设计CRC校验算法。

.2.编程实现CRC校验。

三.实验前的准备1.复习、熟悉CRC校验算法。

2.编写好程序,上机调试。

四.实验要求及实验软硬件环境【基本要求】1.掌握并理解CRC校验算法。

2.编程实现CRC。

3.完成实验报告。

【实验组织方式】小组实验。

【实验条件】配置有java运行环境的微机一台,MyEclipse。

五.实验步骤1.掌握并理解CRC校验算法。

2.设计发送界面。

3.编程实现CRC校验。

4.设计接收界面。

5.调试并实现程序。

6.参加答辩,并撰写实验报告。

六.主要程序部分(Java语言实现)1.发送端主界面MainFrame.java 的主要代码如下所示。

jb.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {String input1 = new String(jtf1.getText());String input2 = new String(jtf2.getText());if("".equals(input1) || "".equals(input2) || input1 == null || input2 == null){JOptionPane.showMessageDialog(jf, "请输入。

", "错误", JOptionPane.ERROR_MESSAGE);}else{ if(dealer.legal_binary(input1)){if(dealer.legal_g_p(input2)){String checkSum = dealer.get_cheksum(input1, input2);String endResult = new String(input1+checkSum);jtf3.setText(checkSum);jtf4.setText(endResult);try {String tem =endResult + "." +input2;fo.inputFile(tem);} catch (Exception e1) {e1.printStackTrace();}}else{JOptionPane.showMessageDialog(jf, "输入的生成多项式不正确", "错误", JOptionPane.ERROR_MESSAGE);}}else{JOptionPane.showMessageDialog(jf, "输入不正确", "错误", JOptionPane.ERROR_MESSAGE);} }}});jb2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0) {jp1.setVisible(false);GetMessage gm = new GetMessage();String str="";try {str = fo.outputFile();} catch (Exception e) {e.printStackTrace();}String L="";String R="";int k= str.length();for (int i = 0; i < str.length(); i++){if (str.substring(i, i + 1).equals(".")){L=str.substring(0,i).trim();R=str.substring(i+1,k).trim();}}gm.jtf1.setText(L);gm.jtf2.setText(R);String res = dealer. get_cheksum (str, R);gm.jtf3.setText(res);gm.setVisible(true);jf.add(gm);}});2.对发送和接收的处理类Dealer.java的主要代码如下所示。

关于CRC循环冗余校验的总结(C#)

关于CRC循环冗余校验的总结(C#)

关于CRC循环冗余校验的总结(C#)1. 实验要求(1)通过CRC(循环冗余校对)序列的计算,掌握C#语⾔中类的静态⽅法与动态⽅法的区别。

(2)Shell与Windows Form 的通信作为扩展提⾼内容。

2. 实验内容主要⼯作是:设计算法实现CRC序列的计算CRC的计算过程总结如下:1、设置CRC寄存器,并给其赋值0xffff;2、读数据⽂件,并将数据的第⼀个8-bit字符与16位CRC寄存器的低8位进⾏异或,并把结果存⼊到CRC寄存器中。

3、将CRC寄存器的数据右移⼀位,⾼位补零,并检查溢出位。

4、如果移出位为0,重复第三步;若低位为1,CRC寄存器与多项式码(此处取0xA001 即⼆进制1010 0000 0000 0001)相异或。

5、重复第3步与第4步直到8次移位全部完成。

此时⼀个8-bit数据处理完毕。

6、重复第2⾄第5步直到所有数据所有数据全部处理完毕。

7、最后将寄存器的⾼8位数值与寄存器的低8位数值交换位置,即得到CRC的最终值。

使⽤静态⽅法与动态⽅法,并⽐较区别设计windows 窗⼝程序3. 详细设计l 需要设计的主要内容如下:1) 需要设计计算⼀次8-bit数据的算法calculate( byte data);2) 使⽤⽂件输⼊流打开指定路径的⽂件,并使⽤readByte()⽅法,逐字节读⼊⽂件,调⽤上述calculate⽅法,直到⽂件尾;3) 将最终CRC计算数值,⾼低位换位置,并将结果转化为16进制l 设计好程序流程图如下:l 因此,重点为设计calculate算法:Calculate()代码如下:以静态⽅法为例static ushort CRC = 0xffff;static string result;// 静态函数计算CRCpublic static void calculate(byte y){int count = 0; // 统计移位次数ushort z = (ushort)(CRC ^ y);int temp = z; // 移位前的数int temp2;while (count < 8){temp2 = temp >> 1; // 移位后的数count++;if (temp2 * 2 == temp) // 溢出的为0{temp = temp2;}else // 溢出的为1{temp = temp2 ^ 0xA001;}}CRC = (ushort)temp;}l 剩下的只需在main 函数中打开输⼊⽂件流,并读⼊数据,迭代计算即可4. 上机实验步骤l 调试的过程:1、打开⽂件输出流,创建⽂本⽂件,将byte a = 02,byte b = 07, 输出到该⽂件中,准备测试。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三CRC校验
一、CRC校验码的基本原理
编码过程:
CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成
多项式g(x),将最后的余数作为CRC校验码。

其实现步骤如下:
1 设待发送的数据块是m位的二进制多项式t(x),生成多项式
为r阶的g(x)。

在数据块的末尾添加r个0,数据块的长度增
加到m+r位。

2 用生成多项式g(x)去除,求得余数为阶数为r-1
的二进制
多项式y(x)。

此二进制多项式y(x)就是t(x)经过生成多项式
g(x)编码的CRC校验码。

3 将y(x)的尾部加上校验码,得到二进制多项式。

就是包含
了CRC校验码的待发送字符串。

解码过程:
从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位
二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式
所以解码时可以用接收到的数据去除g(x),如果余数位零,则
表示传输过程没有错误;如果余数不为零,则在传输过程中肯定
存在错误。

许多CRC的硬件解码电路就是按这种方式进行检错的。

同时,可以看做是由t(x)和CRC校验码的组合,所以解码时将接
收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。

解码过程示例:
运行结果:
附录(实现代码):using System; using ; namespace CRC
{
public abstract class Change
{
oString("x2").ToUpper();
} }
return returnStr;
}
um; }
(databuff);eight < max1) && (data[j].Parent == -1)) { max2 = max1;
tmp2 = tmp1;
tmp1 = j;
max1 =
data[j].Weight; }
else if ((data[j].Weight < max2) && (data[j].Parent == -1))
{ max2 = data[j].Weight;
tmp2 = j;} }
data[tmp1].Parent = + i;
data[tmp2].Parent = + i;
data[ + i].Weight = data[tmp1].Weight + data[tmp2].Weight;
data[ + i].LChild = tmp1;
data[ + i].RChild = tmp2;}
return data; }}
public class NumKindchar
{ public char letter { get; set; }//字符
public int num { get; set; }//字符出现的次数
public List<bool> huffmancode { get; set; }//字符对应的huffman编码
}
public class codeChar
{
public char numChar { get; set; }
public string codeCharater { get; set; } }
}。

相关文档
最新文档