




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CRC校验码软件CRC-16是检测数据在发送过程中发生错误的常用校验方法。一、前言CRC的计算方式是将欲传输的数据块视为一堆连续位所构成的整个数值,将此数值除以一个特定的除数,通常以二进制表示,此除数称为生成多项式(ANSI CRC-16的生成多项式为:x16 + x15 + x2 + 1)。目前较常用的CRC位数目有8和16以及32,在这里只讲述如何写CRC位数目为16的程序。CRC位数目越大,数据的错误检测率则越高,但必须多花一些时间进行数据的计算。二、CRC-16计算步骤CRC-16的计算方法有两种:查表法与计算法,在这里只讲述计算法。在某电力仪表上的说明书中摘录下来的计算CRC-16步
2、骤如下:1、 Load a 16-bit register with FFFF hex. Call this the CRC register.2、 Exclusive OR the first 8-bit byte of the message with the low-order byte of the 16-bit CRC, putting the result in the CRC register.3、 Shift the CRC register one bit to the right (toward the LSB), zero-filling the MSB. Extract
3、 and Examine.4、 If the LSB was 1: Exclusive OR the CRC register with polynomial value A001 hex. If the LSB was 0: Repeat step 3 (another shift).5、 Repeat step 3 and 4 until 8 shifts have been performed. When this is done, a complete 8-bit byte will have been processed.6、 Repeat step 2 through 5 for
4、the next 8-bit byte of them message.7、 The final content of the CRC register is the CRC value.中文解释如下:1、定义一个初始值为FFFF的16位的变量,该变量称为CRC寄存器。(想想在程序中,应该怎么表示16位的变量呢?)2、把欲发送或接收消息的高8位和CRC寄存器的底8位作异或运算,并把结果在赋到CRC寄存器。3、CRC寄存器右移1位(朝最低位),同时最高位添零。取出并检查最低位是否为1。(Visual Basic 里如何做移位的运算呢?)4、如果为1,则CRC寄存器与多项式A001异或;如果为0,
5、则重复第3步的动作。(Visual Basic 里如何判断一个字节里某个位的值呢?)5、重复3和4直到完成了8次移位。这样完整的8位字节将完成处理了。6、对于下一个8位字节的处理就是重复第2步到第5步了7、把所有的欲发送或接收消息这样处理后, CRC寄存器里的值就是我们最终需要得到的CRC校验码。如果你能正确回答我的问题,那么恭喜你,你自己可以用Visual Basic写数据采集卡的控制程序了。三、Visual Basic程序实现以江阴长江斯菲尔电力仪表公司CD194E系列多功能电力仪表的MODBUS-RTU通讯协议的报文格式为例,该表通信报文格式使用的校验方式就是CRC-16。通过对地址01
6、H、命令04H、数据地址005CH和数据长度0004H的CRC-16运算后得到主机请求数据报文的CRC16的校验码为31DBH。 程序界面程序代码:Private Sub cmdGenerate_Click()Dim OutByte(7) As Byte, CRC16() As Byte, CRC16LO As Byte, CRC16HI As Byte, TempHI As Byte, TempLO As ByteDim i As Integer, j As Integer''''''''''''
7、''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
8、'''''''''''''''''''''''''''''''''''''OutByte(0) = Val("&H" & txtOutByte(0).Text)OutByte(1) = Val("&H" & txtOutByte(1
9、).Text)OutByte(2) = Val("&H" & txtOutByte(2).Text)OutByte(3) = Val("&H" & txtOutByte(3).Text)OutByte(4) = Val("&H" & txtOutByte(4).Text)OutByte(5) = Val("&H" & txtOutByte(5).Text) CRC16LO = &HFF '(1)Load a 16-bit registe
10、r with FFFF hex.call this the CRC register. CRC16HI = &HFFFor i = 0 To UBound (OutByte) - 2 CRC16LO = CRC16LO Xor OutByte (i) '(2)Exclusive OR the first 8-bit byte of the message 'with the low-order byte of the 16-bit CRC, 'putting the result in the CRC register For j = 0 To 7 TempHI
11、 = CRC16HI TempLO = CRC16LO CRC16HI = CRC16HI 2 '(3)Shift the CRC register one bit to the right(toward the LSB),zero-filling CRC16LO = CRC16LO 2 'the MSB.Extract and Examine If (TempHI And &H1) = &H1) Then CRC16LO = CRC16LO Or &H80 '移位时,如果高低位是1,则低高位加1 End If If (TempLO And &a
12、mp;H1) = &H1) Then '(4)if the LSB was 1: CRC16HI = CRC16HI Xor &HA0 'Exclusive OR the CRC register with polynomial value A001 hex. CRC16LO = CRC16LO Xor &H1 End If 'if the LSB was 0: Repeat step 3 (another shift) Next j '(5)Repeat step 3 and 4 until 8 shifts have been per
13、formed. 'when this is done, a complete 8-bit byte will have been processed.Next i '(6)Repeat step 2 through 5 for the next 8-bit byte of them message. OutByte(6) = CRC16LO '(7)The final contents of the CRC register is the CRC value txtOutByte(6) = Hex(OutByte(6) OutByte(7) = CRC16HI txtO
14、utByte(7) = Hex(OutByte(7)End Sub四、Visual C+程序实现 程序界面主要代码:#define CHECKVALUE(pt,nl) if(btData=NULL)|(nLength<=0)AfxMessageBox("无效数组!");return -1;BOOL CCRC_16Dlg:OnInitDialog()m_strCRC="01 04 00 5C 00 04"UpdateData(FALSE);return TRUE; / return TRUE unless you set the focus to a
15、 controlvoid CCRC_16Dlg:OnOK()UpdateData(TRUE);CString strTemp;strTemp=m_strCRC;WORD CRC;BYTE btData4096;int nLength=StrToHex(strTemp,btData); CRC=ANSI_CRC_16(btData,nLength); /ANSI-16CString str;str.Format(" %02X %02X",(BYTE)(CRC>>8),(BYTE)CRC);AfxMessageBox(str);CDialog:OnOK();WORD
16、 CCRC_16Dlg:ANSI_CRC_16(BYTE* btData,int nLength) /ANSI CRC-16,x16 + x15 + x2 + 1CHECKVALUE(btData,nLength);WORD CRC=0xFFFF;BYTE j,Tmp=0;int i; for(i=0;i<nLength;i+) CRC=btDatai; /做位异或运算 for (j=0;j<8;j+) Tmp=CRC&0x0001; /位与运算 CRC=CRC>>1; /位右移运算 if(Tmp) CRC=(CRC0xA001); return (CRC>
17、;>8)+(CRC<<8);int CCRC_16Dlg:StrToHex(CString str, BYTE *btData)int nLength=str.GetLength();if(nLength<2) return 0;for(int i=0;i<nLength;i+=3) _stscanf(str.Mid(i,2),"%02X",&btDatai/3);return (i+1)/3;五、结论1, 这两个实例可以当作计算CRC-16的小工具,代码对于自己要开发CRC-16的人员也提供一些参考价值。2, 如果你在Visual B
18、asic里,右移应该做什么运算,那么你就真的看进去了,如果你不知道,可以发E-Mail给我。3, 同一个实例,两种开发语言,值得学习一下。看到这里,你可以告诉我在VC+中,异或是用什么符号?是不是很意外呢?CRC校验1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为0和1取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=xRm(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+ g2x2+.+g(R-1)x(R-1)+gRxR发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。4、CRC校验码软件生成方法:借助于多项式除法,其余数为校验
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025工厂员工安全培训考试试题含答案下载
- 2025年公司安全培训考试试题附参考答案【基础题】
- 2024-2025公司管理人员安全培训考试试题【含答案】
- 2024-2025员工三级安全培训考试试题答案完美
- 高校体育赛事反兴奋剂管理措施
- 金融行业突发危机应对措施
- 大学生主题班会组织方案
- 中学教师暑期技能提升计划
- 商场火灾应急预案操作流程
- 景观基因视角下的传统村落景观空间设计研究-以咸宁市羊楼洞村为例
- 高铁站房精装修施工方案
- 明修栈道暗渡陈仓
- 镇村综治中心治安防控室工作台账(完整打印版)
- 2020年10月自考00152组织行为学试题及答案
- 课程设计(集装箱专用平车总体设计)
- 人工挖土方注意事项
- 中国联通大客户业务故障处理工作实施细则
- GB/T 6488-2022液体化工产品折光率的测定
- GB/T 1871.1-1995磷矿石和磷精矿中五氧化二磷含量的测定磷钼酸喹啉重量法和容量法
- FZ/T 73023-2006抗菌针织品
- 做好群众工作
评论
0/150
提交评论