下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、vb下的crc校验程序随着计算机技术的不断发展,在现代工业屮,利用微机进行数据通讯的工业控制应用得 也越來越广泛。山于传输距离、现场状况等诸多可能出现的因素影响,计算机与受控设备之 间的通讯数据常会发生无法预测的错误。为了防止错误所带来的影响,一般在通讯时釆取数 据校验的办法,而循环兀余码校验是最常用的校验方法之一。在实际使用的各种现场总线协 议小,数据帧的校验一般都釆用这种检验方式。一、循环冗余码校验原理循环冗余码校验英文名称为cyclical redundancy check,简称crc。它是利用除法及余 数的原理來作错误侦测(error detecting)的。他将耍发送的数据比特序列当
2、作一个多项式 f(x)的系数,发送时用双方预先约定的生成多项式g(x)去除,求得一个余数多项式,将余数 多项式加到数据多项式z后发送到接收端,接收端同样用g(x)去除接收到的数据,进行计 算,然后把计算结果和实际接收到的余数多项式数据进行比较,相同的话表示传输止确。 crc校验检错能力强,容易实现,是冃前应用授广的检错码编码方式z。在国际标准屮,根据牛成多项式g(x)的不同,crc 乂可分为以f儿种标准: crc-12 码:g(x)=x12+x11+x3+x2+x+1 crc-16 码:g(x)=x16+x15+x2+1 crc-ccitt 码:g(x)=x 16+x12+x5+1 crc-3
3、2 码:g(x)=x32+x26+x23+x22+x16+x12+x 11+x1 °+x8+x7+x5+x4+x2+x1+x+1crc-12码通常用来传送6-bit字符串。crc-16及crc-ccitt码则用是来传送8-bit字 符,其中crc-16为美国采用,而crc-ccitt为欧洲国家所采用。crc-32码大都被采用 在一种称为point-to-point的同步传输屮。下iflj以最常用的crc-16为例来说明其生成过程。crc-16码由两个字节构成,在开始时crc w存器的每一位都预置为1,然后把crc 寄存器与8-bit的数据进行异或,之后对crc寄存器从高到低进行移位,
4、在最高位(msb) 的位置补零,而最低位(lsb,移位后已经被移出crc寄存器)如果为1,则把寄存器与 预定义的多项式码进行异或,否则如果lsb为零,则无需进行异或。重复上述的由高至低 的移位8次,第一个&bit数据处理完毕,用此吋crc寄存器的值少下一个弘bit数据界或 并进行如前一个数据似的8次移位。所有的字符处理完成后crc寄存器内的值即为最终的 crc 值。下面为crc的计算过程:1 设置crc寄存器,并给其赋值ffff(hex)。2. 将数据的第一个8-bit字符为16位crc寄存器的低8位进行界或,并把结果存入 crc寄存器。3. crc寄存器向右移一位,msb补零,移出并
5、检查lsb。4. 如果lsb为(),重复第三步;若lsb为1, crc寄存器与多项式码札i异或。5. 重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。6. 重复第2至笫5步直到所有数据全部处理完成。7. 最终crc寄存器的内容即为crc值。二、循环冗余码校验程序的编写明口了 crc校验码的产生过程,编写起程序来就非常容易了。由于visual basic的广泛 普及以及其在数据通讯中的重要地位,下面就以vb语言来编写crc的生成程序,其它语 言只需稍做修改即可。编写crc校验程序有两种办法:一种为计算法,一种为查表法。通常使用查表法,尤 其在vb程序中,可以大大降低cpu的
6、运算时间。下而对两种方法分别讨论。1 计算法计算法就是依据crc校验码的产生原理來设计程序。其优点是模块代码少,修改灵活, 可移植性好。其缺点为计算量大。为了便于理解,这里假定了三位数据,而多项式码为 aoo1 (hex) o在窗体上放置一命令按钮command!,并添加如卜"代码:private sub command 1 _click()dim crc() as bytedim d() as byte彳寺传输数据redim d(2) as byted(0)= 123d(l)= 112d(2)= 135crc = crc 16(d) "调用crc16计算函数'cr
7、c(o)为高位crc为低位end sub注意:在数据传输时crc的低位可能在前,而高位在后。function crc 16(data() as byte) as stringdim crci6l0 as byte, crc16hi as byte crc 寄存器dim cl as byte, ch as byte1 多项式码&ha001dim savehi as byte, savelo as bytedim i as integerdim flag as integercrc16lo= &hffcrc16hi 二 &hffcl=&h1ch =&haof
8、or i = 0 to ubound(data)crci6l0 = crci6l0 xor data(i),每一个数据与crc寄存器进行界或for flag = oto 7savehi = crc 16hisavelo = crc16locrc16hi = crc16hi 2,高位右移一位crc 16lo = crc 16lo2彳氐位右移一位if (savehi and &hl) = &hl) then '如果高位字节最示一位为1crci6l0 = crci6l0 or &h80呗u低位字节右移后前面补1end if'否则自动补0if (savelo a
9、nd &h1) = &hl)then ,如果lsb为1,则与多项式码进行开或crc 16hi = crc16hi xor chcrc16lo =crc16lo xor clend ifnext flagnext idim returndata(l) as bytereturndata(o) = crc16hicrc 高位returndata( 1) =crc 16lo*crc 低位crc 16 = returndataend function2.查表法查表法的优缺点与计算法的正好相反。为了便于比较,这里所冇的假定与计算法的完全 相同,都而在窗体上放置一个command 1的按钮
10、,其代码部分与上面的也完全一致。f® 只介绍crc函数的编写源代码。private function crc16(data() as byte) as stringdim crc16hi as bytedim crci6l0 as bytecrc16hi = &hffcrc16l0 =&hffdim i as integerdim ilndcx as longfor i = 0 to ubound(data)ilndex = crc 16l0 xor data(i)crc 16l0 = crc16hi xor getcrclo(ilndex)低位处理crc16hi =
11、getcrchi(iindex),髙位处理next idim rcturndata(l) as bytereturndata(o) = crc 16hi'crc 高位returndata(l) =crc 16l0*crc 低位crc16 = returndataend function crc低位字节值表function getcrclo(ind as long) as bytegetcrclo = choose(ind + 1, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41,
12、&h1, &hc(), &h8(), &h41, &h(), &hc1, &h81, &h40, &h1, &hc(), &h8(), &h41, &h(), &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hco, &h80, &h41, &h0, &hc1, &a
13、mp;h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h4i, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0,
14、&hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc(), &h8(), &h41, &h(), &hc1, &h81, &h4(), &h1, &hc0, &h80,&h41, &h1, &hco, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &
15、;h40, &h1, &hc0, &h80, &h41, &h1, &hco, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &a
16、mp;h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0,&hcl, &h81, &h40, &h0, &
17、amp;hc1, &h81, &h40,&hl, &hco, &h80, &h4i, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80,&h41,
18、&h0, &hc1, &h81, &h40, &h1, &hco, &h80, &h41, &h1, &hco, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hco, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hco, &h80
19、, &h41, &h1, &hco, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hco, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hco, &h8(), &h41, &h1, &hco, &h80, &h41, &h(), &
20、;hc1, &h81, &h40) end function*crc高位字节值表function getcrchi(ind as long) as bytegetcrchi = choose(ind + 1, &h0, &hc0, &hc1, &h1, &hc3, &h3, &h2, &hc2, &hc6, &h6, &h7, &hc7, &h5, &hc5, &hc4, &h4, &hcc, &hc, &hd, &hc
21、d, &hf, &hcf, &hce, &he, &ha, &hca, &hcb, &hb, &hc9, &h9, &h& &hc& &hd& &h1& &h19, &hd9, &h1b, &hdb, &hda, &h1a, &h1e, &hde, &hdf, &h1f, &hdd, &h1d, &h1c, &hdc, &h14, &
22、amp;hd4, &hd5, &h15, &hd7, &h17, &h16, &hd6, &hd2, &h12, &h13, &hd3, &h11, &hd1, &hd0, &h10, &hf0, &h30, &h31, &hf1, &h33, &hf3, &hf2, &h32, &h36, &hf6, &hf7, &h37, &hf5, &h35, &h34, &
23、amp;hf4, &h3c, &hfc, &hfd, &h3d, &hff, &h3f, &h3e, &hfe, &hfa, &h3a, &h3b, &hfb, &h39, &hf9, &hf& &h3& &h2& &he& &he9, &h29, &heb, &h2b, &h2a, &hea, &hee, &h2e, &h2f, &hef,
24、 &h2d, &hed, &hec, &h2c, &he4, &h24, &h25, &he5, &h27, &he7, &he6, &h26, &h22, &he2, &he3, &h23, &he1, &h21, &h20, &he0, &ha0, &h60, &h61, &ha1, &h63, &ha3, &ha2, &h62, &h66, &ha6,
25、 &ha7, &h67, &ha5, &h65, &h64, &ha4, &h6c, &hac, &had, &h6d, &haf, &h6f, &h6e, &hae, &haa, &h6a, &h6b, &hab, &h69, &ha9, &ha& &h6& &h7& &hb& &hb9, &h79, &hbb, &h7b, &h7a, &hba, &hbe, &h7e, &h7f, &hbf, &h7d, &hbd, &hbc, &h7c, &
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 操作系统体系课程设计
- 深度强化学习游戏AIAtari深度实践课程设计
- Snort网络监控课程开发指南课程设计
- 内河航运工程师考试试卷及答案
- 容器逃逸检测应用开发课程设计
- 包装机物料处理设计技术课程设计
- 笔记本支架课程设计
- 美容美体师岗位招聘考试试卷及答案
- 2026年中秋节假期幼儿园中秋美食分享会
- 劳务派遣用工风险防范全攻略
- 2024计量经济期末考全套押题卷及答案解析
- 六鑫LS系列伺服刀塔操作说明书
- 2025年度苏州城际铁路有限公司管理岗位公开招聘笔试参考题库附带答案详解
- 2025年绿盟科技服务方向笔试题及答案
- 我们周围的物体课件
- 2026年中央一号文件解读:农业机械化水平提升
- 中国华能集团有限公司行测笔试题库2026
- 乳腺癌案例教学教案
- 泪道冲洗健康宣教
- 民法监护人课件
- 护理心内科进修后回院汇报
评论
0/150
提交评论