VB6的CRC校验程序
- 格式:doc
- 大小:22.00 KB
- 文档页数:1
VB下如何编写CRC校验程序在VB编程语言中编写CRC校验程序有多种方法。
下面是一种使用VB 的示例代码,用于计算32位CRC校验和。
首先,我们需要定义一个函数来计算CRC校验和。
以下是一个示例函数:```vbFunction CalculateCRC32(ByVal data As String) As String' CRC32 lookup tableDim table(255) As LongDim crc As LongDim i As Long, j As Long' Generate CRC32 lookup tableFor i = 0 To 255crc = iFor j = 0 To 7If crc And 1 ThenElsecrc = crc \ 2End IfNext jtable(i) = crcNext i' Calculate CRC32 checksumcrc = &HFFFFFFFFFor i = 1 To Len(data)crc = table((crc Xor Asc(Mid(data, i, 1))) And 255) Xor ((crc And &HFFFFFF00) \ &H100)Next icrc = crc Xor &HFFFFFFFF' Convert CRC32 checksum to hexadecimal stringEnd Function```以上的函数使用了CRC32查找表来加快计算速度。
函数接受一个字符串作为输入,并返回计算出的CRC32校验和,以16进制字符串形式返回。
接下来,可以在主程序中调用该函数来计算CRC校验和。
以下是一个示例:```vbSub MainDim data As StringDim crc As String'输入需要计算校验和的数据data = "Hello World!"'计算CRC32校验和crc = CalculateCRC32(data)'显示结果MsgBox "CRC32校验和: " & crc, vbInformationEnd Sub```在上述示例中,我们定义了一个名为`Main`的子程序,该程序首先要求用户输入要计算CRC校验和的数据,然后调用`CalculateCRC32`函数计算CRC32校验和,并使用`MsgBox`函数显示结果。
CRC校验VB与汇编程序采用CRC-16,即2字节冗余循环码CRC,低字节在前。
CRC码由发端计算,放置于发送消息帧的尾部,接收端再重新计算接收到信息的CRC码,比较计算得到的CRC码是否与接收到的相符,若不符则表明出错。
CRC码的计算包括整个消息内容,计算时只用8位数据位,而起始位、停止位及可能的校验位均不参与CRC计算。
CRC校验可以100%检测出所有奇数个随机错误。
CRC-16校验可以检测出长度小于等于16的突发错误,可以保证在1014 bit码元中只含有1位未被检测出的错误。
CRC-16的具体算法有多种,以下是一个例子。
1.置16位寄存器为全1,作为CRC寄存器。
2.把一个8位数据与16位CRC寄存器的低字节相异或,把结果放于CRC寄存器中。
3.把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(移出位)。
4.如果最低位为0,重复③(再移位);如果最低位为1,CRC寄存器与多项式A001H(1010 0000 0000 0001)进行异或。
5.重复③、④,直到右移8次,这样整个8位数据全部进行了处理。
6.重复②-⑤,进行下一个8位数据的处理。
7.将一帧的所有数据字节处理完后得到CRC-16寄存器。
8.将CRC-16寄存器的低字节和高字节交换,得到的值即为CRC-16码。
CRC校验汇编子程:算法如下://CRC校验子程序开始crc_jiaoyan:mov 20h,#0xffmov 21h,#0xffmov 12h,#0x0dmov 11h,#0x08mov r0,#0x34zijiekaishi:mov a,21hxrl a,@r0kaishi:rrc amov 21h,amov 10h,cclr cmov a,20hrrc amov 0fh,cmov 20h,aanl 20h,#0x7fjnb 10h,nextxrl 21h,#0x01xrl 20h,#0xa0next:mov a,21hdjnz 11h,kaishimov 11h,#0x08inc r0djnz 12h,zijiekaishimov 42h,20hmov 41h,21hret//CRC校验子程序结束比如:Dim SendStr() As ByteSendStr(0) = 1 '从站号是1SendStr(1) = &H3 '读多个字的命令代码SendStr(2) = 0 '起始地址高字节SendStr(3) = 0 '起始地址低字节SendStr(4) = &H0 '数据长度高字节SendStr(5) = &H9 '数据长度低字节SendStr(6) =?校验高位SendStr(7) =?校验低位CRC校验VB子程'CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''使用CommandButton控件调用一个函数'' '''' ''''进行CRC校检'' '' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Private Sub compute_CRC_Click()Dim BCRC%, GP&, BDF& '定义一个整型两个长整型变量'BCRC--->CRC的位数目'GP --->生成多项式generationPolynomial 校验用的除数'BDF --->待校验的数据块的十进制表示'Integer % 整型'Long & 长整型'Single ! 单精度'Double # 双精度'Currency @ 货币'String $ 字符串BCRC = 16 '采用的是CRC-16校验'生成多项式g(2)=2^16+2^12+2^5+1 即1 0001 0000 0001 0001'F*2^16=A*G+CGP = Val("&H" & CStr(genPoly_outPut.Text) & "&") '转成十六进制字符串后再转成十进制数BDF = Val("&H" & CStr(dataBlock_outPut.Text) & "&") '同上CRCValue_outPut.Text = Hex(CalCRC(BCRC, GP, BDF)) '将计算的结果转为十六进制字符串输出End SubFunction CalCRC(BCRC_RX As Integer, GP_RX As Long, BDF_RX As Long) As LongDim C1&, C2&Dim A1%, PreC1&Dim LeftValue%, AlShift%If BDF_RX = 0 ThenCalCRC = 0Exit FunctionEnd IfA1 = (Len(Hex(BDF_RX)) - 1) * 4 '除数比被除数差多少位除数就要向左移多少位位数一样才能做Xor运算嘛'这个相差的位数由两部分组成'这里计算的是第一部分C1 = BDF_RX * 2 ^ BCRC_RXLeftValue = Val("&H" & Mid(Hex(BDF_RX), 1, 1))If LeftValue >= 1 Then AlShift = 1 '这里就是第二部分If LeftValue >= 2 Then AlShift = 2 '同上If LeftValue >= 4 Then AlShift = 3 '同上If LeftValue >= 8 Then AlShift = 4 '同上A1 = A1 + (AlShift - 1)C2 = GP_RX * 2 ^ A1DoPreC1 = C1 '先把C1备个份如果下步的Xor不是我们想要的就可以用备份的数据重新XORC1 = C1 Xor C2 '不管C2是不是合适先算一次再说C2如果不合适C1就应该与C2右移数位后的数据进行XorDoA1 = A1 - 1If C1 > PreC1 Then '检查C1的值以便确定上一步Xor运算中C2是否是合适的值C1 = PreC1 Xor GP_RX * 2 ^ A1ElseExit DoEnd IfLoopC2 = GP_RX * 2 ^ A1 '每次C2向右移一位甚至更多Loop Until C1 < GP_RX '余数比除数小的时候结果就出来了CalCRC = C1 'C1就是最终的CRC校验码先从函数返回这个值最后再转成十六进制End Function。
如何在VB中编写CRC校验程序
在VB中编写CRC校验程序,可以通过以下步骤来实现:
1.了解CRC校验算法:
CRC(Cyclic Redundancy Check)校验是一种常见的错误检测机制,
通过对数据进行计算生成固定长度校验码来验证数据的完整性。
CRC校验
算法使用生成多项式来计算校验码,具体的生成多项式由所使用的CRC标
准决定。
2.导入系统命名空间:
3.创建CRC校验类:
在VB中,可以创建一个类来封装CRC校验的相关操作。
可以定义该
类的属性来存储生成多项式等信息,以及定义方法来执行CRC校验。
4.实现CRC校验方法:
根据CRC校验算法,可以实现一个方法来计算数据的校验码。
具体步
骤如下:
-准备一个数据缓冲区,将待校验的数据按照一定的规则放入缓冲区。
-根据生成多项式,对缓冲区中的数据进行逐位运算,得到校验码。
-返回校验码。
5.调用CRC校验方法:
在主程序中,可以实例化CRC校验类,并调用其中的方法来进行校验。
将待校验的数据作为参数传递给校验方法,获取校验码。
6.完善错误处理:
在代码中需要加入适当的错误处理机制,以捕捉可能出现的异常情况,并给出相应的提示或处理方法。
综上所述,以上是在VB中编写CRC校验程序的基本实现步骤。
具体
的代码实现可以从以下几个方面来展开:导入命名空间、创建CRC校验类、实现CRC校验方法、调用CRC校验方法、错误处理和测试验证等。
编写时
需要根据具体的应用场景和需求来确定具体的实现细节和功能。
VB与modbus rtu协议通信,并进行CRC校验modbus rtu协议可以算是一种事实上的工业标准协议,为许多仪表、PLC等所支持。
以前有几个用户问如何使用VB编程来与我们的KND-K3系列PLC通讯,于是整了一个demo程序。
这次把这个demo共享,希望能给大家一点帮助。
1)模块文件:modCRC,其中包含了CRC校验的函数。
'data 待校验的数组名称'no 数组中元素个数'btLoCRC 算出的CRC高字节'btHiCRC 算出的CRC低字节Public Function CalCRC16Fast(data() As Byte, no As Integer, btLoCRC As Byte, btHiCRC As Byte) As StringDim CL As Byte, CH As Byte '多项式码&HA001Dim SaveHi As Byte, SaveLo As ByteDim i As IntegerDim Flag As IntegerbtHiCRC = &HFFbtLoCRC = &HFFCL = &H1CH = &HA0For i = 0 To (no - 1)btHiCRC = btHiCRC Xor data(i) '每一个数据与CRC寄存器进行异或For Flag = 0 To 7SaveHi = btLoCRCSaveLo = btHiCRCbtLoCRC = btLoCRC \ 2 '高位右移一位btHiCRC = btHiCRC \ 2 '低位右移一位If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1btHiCRC = btHiCRC Or &H80 '则低位字节右移后前面补1End If'否则自动补0If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或btLoCRC = btLoCRC Xor CHbtHiCRC = btHiCRC Xor CLEnd IfNext FlagNext iDim ReturnData(1) As ByteReturnData(0) = btHiCRC 'CRC高位ReturnData(1) = btLoCRC 'CRC低位CalCRC16Fast = ReturnDataEnd FunctionPublic Function CalCRC16Tbl(data() As Byte, no As Integer, btLoCRC As Byte, btHiCRC As Byte) As StringDim btLoCRC As ByteDim btHiCRC As BytebtLoCRC = &HFFbtHiCRC = &HFFDim i As IntegerDim iIndex As LongFor i = 0 To (no - 1)iIndex = btHiCRC Xor data(i)btHiCRC = btLoCRC Xor GetCRCLo(iIndex) '低位处理btLoCRC = GetCRCHi(iIndex)'高位处理Next iDim ReturnData(1) As ByteReturnData(0) = btHiCRC 'CRC高位ReturnData(1) = btLoCRC 'CRC低位CalCRC16Tbl = ReturnDataEnd Function'CRC低位字节值表Function GetCRCLo(Ind As Long) As ByteGetCRCLo = Choose(Ind + 1, _&H0, &HC1, &H81, &H40, &H1, &HC0 , &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H4 0, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H0, &HC1 , &H81, &H40, &H1, &HC0, _&H80, &H41, &H1, &HC0, &H80, &H4 1, &H0, &HC1, &H81, &H40, _&H0, &HC1, &H81, &H40, &H1, &HC0 , &H80, &H41, &H0, &HC1, _&H81, &H40, &H1, &HC0, &H80, &H4 1, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H1, &HC0 , &H80, &H41, &H0, &HC1, _&H81, &H40, &H0, &HC1, &H81, &H4 0, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H1, &HC0 , &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H4 0, &H0, &HC1, &H81, &H40, _&H1, &HC0, &H80, &H41, &H1, &HC0 , &H80, &H41, &H0, &HC1, _&H81, &H40, &H1, &HC0, &H80, &H4 1, &H0, &HC1, &H81, &H40, _&H0, &HC1, &H81, &H40, &H1, &HC0 , &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H4 0, &H0, &HC1, &H81, &H40, _&H1, &HC0, &H80, &H41, &H0, &HC1 , &H81, &H40, &H1, &HC0, _&H80, &H41, &H1, &HC0, &H80, &H4 1, &H0, &HC1, &H81, &H40, _&H0, &HC1, &H81, &H40, &H1, &HC0 , &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H4 0, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H0, &HC1 , &H81, &H40, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H4 0, &H1, &HC0, &H80, &H41, _&H1, &HC0, &H80, &H41, &H0, &HC1 , &H81, &H40, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H4 0, &H0, &HC1, &H81, &H40, _&H1, &HC0, &H80, &H41, &H1, &HC0 , &H80, &H41, &H0, &HC1, _&H81, &H40, &H0, &HC1, &H81, &H4 0, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, & H41, &H1, &HC0, &H80, &H41, &H0, &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, &HCD, &HF, &HCF, &HCE, &HE, &HA, &HCA, &HCB, &HB, &HC9, &H9, &H 8, &HC8, &HD8, &H18, &H19, &HD9, &H1B, &HDB, &HDA, &H1A, &H1E, &HDE, &HDF, &H1F, &HDD, &H1D, &H1C, &HDC, &H14, &HD4, &HD5, &H15, &HD7, &H17, &H16, &HD6, &HD2, &H12, &H13, &HD3, &H11, &HD1, &HD0, &H10, &H F0, &H30, &H31, &HF1, &H33, &HF3, &HF2, &H32, &H36, &HF6, &HF7, &H37 , &HF5, &H35, &H34, &HF4, &H3C, &HFC, &HFD, &H3D, &HFF, &H3F, &H3E, &HFE, &HFA, &H3A, &H3B, &HFB, &H39, &HF9, &HF8, &H38, &H28, &HE8, &HE9, &H29, &HEB, &H2B, &H2A, &HEA, &HEE, &H2E, &H2F, &HEF, &H2D, &H ED, &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, &HA7, &H67 , &HA5, &H65, &H64, &HA4, &H6C, &HAC, &HAD, &H6D, &HAF, &H6F, &H6E, &HAE, &HAA, &H6A, &H6B, &HAB, &H69, &HA9, &HA8, &H68, &H78, &HB8,&HB9, &H79, &HBB, &H7B, &H7A, &HBA, &HBE, &H7E, &H7F, &HBF, &H7D, &H BD, &HBC, &H7C, &HB4, &H74, &H75, &HB5, &H77, &HB7, &HB6, &H76, &H72 , &HB2, &HB3, &H73, &HB1, &H71, &H70, &HB0, &H50, &H90, &H91, &H51, &H93, &H53, &H52, &H92, &H96, &H56, &H57, &H97, &H55, &H95, &H94, &H54, &H9C, &H5C, &H5D, &H9D, &H5F, &H9F, &H9E, &H5E, &H5A, &H9A, &H 9B, &H5B, &H99, &H59, &H58, &H98, &H88, &H48, &H49, &H89, &H4B, &H8B , &H8A, &H4A, &H4E, &H8E, &H8F, &H4F, &H8D, &H4D, &H4C, &H8C, &H44, &H84, &H85, &H45, &H87, &H47, &H46, &H86, &H82, &H42, &H43, &H83, &H41, &H81, &H80, &H40)End Function2)窗体:FORM1,上面放置的控件如下:Begin VB.Form frmComCaption = "Form1"ClientHeight = 8235ClientLeft = 3885ClientTop = 2250ClientWidth = 6810LinkTopic = "Form1"ScaleHeight = 8235ScaleWidth = 6810Begin VB.TextBox txtReceive ‘注:放置接收上来的IB0数据Height = 495Left = 1200TabIndex = 2Top = 2280Width = 1335EndBegin mandButton Command1Caption = "读取IB0"Height = 495Left = 2760TabIndex = 1Top = 2280Width = 1695EndBegin mandButton cmdSDOCaption = "置位Q1.1"Height = 495Left = 2160TabIndex = 0Top = 3720Width = 1575EndBegin MSCommLib.MSComm ComK3Left = 480Top = 1080_ExtentX = 1005_ExtentY = 1005_Version = 393216DTREnable = -1 'TrueEndEnd①Form_Load事件,在此主要是实现了打开并初始化串口Private Sub Form_Load()With ComK3.CommPort = 1.Settings = "19200,N,8,1".InputMode = comInputModeBinary '二进制收发.InBufferSize = 512.OutBufferSize = 512If (Not .PortOpen) Then .PortOpen = True End WithEnd Sub②Form_UnLoad事件,在此主要是关闭串口Private Sub Form_Unload(Cancel As Integer)If (ComK3.PortOpen) ThenComK3.PortOpen = FalseEnd IfEnd Sub③“置位Q1.1”按钮单击事件'设置Q1.1为1Private Sub cmdSDO_Click()Dim btSend(8) As BytebtSend(0) = &H1 '目标站号btSend(1) = &H5 '功能码btSend(2) = &H0 'Q1.1地址(0009)高字节btSend(3) = &H9 'Q1.1地址(0009)低字节btSend(4) = &HFF '强制值高字节btSend(5) = &H0 '强制值低字节Dim crcDim btCRCHi As Byte, btCRCLo As Bytecrc = CalCRC16Fast(btSend, 6, btCRCLo, btCRCHi)btSend(6) = btCRCHibtSend(7) = btCRCLoComK3.Output = CVar(btSend)End Sub④“读取IB0”按钮单击事件'查表知I0.0的modbus地址为0000,从I0.0开始读取连续8位Private Sub Command1_Click()'发请求Dim btSend(8) As BytebtSend(0) = &H1 '目标站号btSend(1) = &H2 '功能码btSend(2) = &H0 'I0.0地址(0000)高字节btSend(3) = &H0 'i0.0地址(0000)低字节btSend(4) = &H0 '读取个数高字节btSend(5) = &H8 '读取个数低字节Dim crcDim btCRCHi As Byte, btCRCLo As Bytecrc = CalCRC16Fast(btSend, 6, btCRCLo, btCRCHi)btSend(6) = btCRCHibtSend(7) = btCRCLoComK3.Output = CVar(btSend)'注意下面编写的接收过程很简单,要编写实际应用的监控程序来说需要更完善Dim btReceive As VariantWith ComK3DoDoEventsLoop Until .InBufferCount = 6。
用VB编写的CRC校验程序Private Sub Command1_Click()Dim bcrc%, gp&, bdf& bcrc值为整型, gp值为长整型, bdf值为长整型bcrc = 16 用CRC—16位校验gp = V al("&H" & CStr(Text2.Text) & "&") gp为生成多项式缺省为11021(16进制)bdf = Val("&H" & CStr(Text1.Text) & "&") bdf为原值Text3 = Hex(calcrc(bcrc, gp, bdf)) 为生成的CRC值End SubFunction calcrc(bcrc As Integer, gp As Long, bdf As Long) As LongDim c1&, c2&Dim a1%, prec1&Dim leftvalue%, a1shift%If bdf = 0 Thencalcrc = 0Exit FunctionEnd Ifa1 = (Len(Hex(bdf)) - 1) * 4 a1 ={原值(16进制)的字符数目-1}*4c1 = bdf * 2 ^ bcrc 进行异或运行前,把原值(2进制)后面加16个0leftvalue = Val("&H" & Mid(Hex(bdf), 1, 1)) 原值的左边第1位(最高位)数值(16进制)If leftvalue >= 1 Then a1shift = 1 原值的最高位=1 偏差=1If leftvalue >= 2 Then a1shift = 2 原值的最高位=2或3 偏差=2If leftvalue >= 4 Then a1shift = 3 原值的最高位>=4,<=7 偏差=3If leftvalue >= 8 Then a1shift = 4 原值的最高位>=8 偏差=4a1 = a1 + (a1shift - 1) 原值(后面加16个0)与生成多项式的二进制码的个数差c2 = gp * 2 ^ a1 把生成多项式的后面也相应加a1个0Doprec1 = c1c1 = c1 Xor c2 原值与生成多项式进行异或Doa1 = a1 – 1 a1数值减1If c1 > prec1 Then 如果异或的结果大于原值,说明原值的左边第1位(最高位)为0 c1 = prec1 Xor (gp * 2 ^ a1) 把a1的值减少一位后,继续异或ElseExit DoEnd IfLoopc2 = gp * 2 ^ a1Loop Until c1 <= gp 直至异或的结果小于生成多项式calcrc = c1 所得的异或结果即是CRC值End Function。
用VB编写的Modbus通讯CRC16校验程序用VB编写的Modbus通讯CRC16校验程序(2007-09-27 21:48:19)转载▼标签:IT/科技Rem 声明CRC16冗余校验函数ACS510_CRCPrivate Declare Function ACS510_CRC Lib "ACS510.dll" (ByVal a As Long, ByVal a As Long) As LongPublic Function ACS510_Cmd(ByVal StationID As Long, ByVal WRcmd As Long, ByVal WRAddress As Long, ByVal Data As Long) As StringDim StatID As String '定义从机地址缓存区Dim Cmd As String '定义功能命令缓存区Dim Address As String '定义读写地址缓存区Dim WRAddressHi As String '定义读写地址的高半字节缓存区Dim WRAddressLo As String '定义读写地址的低半字节缓存区Dim hData As String '定义读写数据缓存区Dim DataHi As String '定义读写数据高半字节缓存区Dim DataLo As String '定义读写数据低半字节缓存区Dim CRCBuffer1 As String '定义从机地址校验缓存区Dim CRCBuffer2 As String '定义命令校验缓存区Dim CRCBuffer3 As String '定义读写地址高字节校验缓存区Dim CRCBuffer4 As String '定义读写地址低字节校验缓存区Dim CRCBuffer5 As String '定义读写数据高半字节校验缓存区Dim CRC As String '定义读写数据低半字节校验缓存区(也即是CRC计算的最后结果)Dim CRCHi As String '定义校验高半字节缓存区Dim CRCLo As String '定义校验低半字节缓存区Dim CRC_Even As String '定义校验结果取反缓存区Rem 取从机的地址StatID = Trim(Hex(StationID))If StatID = "" ThenMsgBox "目的地地址不能为空!", vbInformation + vbOKOnly, "系统提示!"Exit FunctionElseIf Len(StatID) = 1 ThenStatID = "0" + StatIDEnd IfIf Len(StatID) >= 2 ThenStatID = Trim(Right(StatID, 2))End IfEnd IfRem 取读写命令Cmd = Trim(Hex(WRcmd))If Cmd = "" ThenMsgBox "读写命令不能为空!", vbInformation + vbOKOnly, "系统提示!"Exit FunctionElseIf Len(Cmd) = 1 ThenCmd = "0" + CmdEnd IfIf Len(Cmd) >= 2 ThenCmd = Trim(Right(Cmd, 2))End IfEnd IfRem 取读写数据的地址Address = Trim(Tran_Format(Trim(Hex(WRAddress))))WRAddressHi = Trim(Mid$(Address, 1, 2))WRAddressLo = Trim(Mid$(Address, 3, 2))Rem 取读写的数据(读时为字节数,写时为要写的数据)hData = Trim(Tran_Format(Trim(Hex(Data))))DataHi = Trim(Mid$(hData, 1, 2))DataLo = Trim(Mid$(hData, 3, 2))Rem 计算从机地址的校验CRCBuffer1 = ACS510_CRC(65535, StationID)Rem 计算读写命令的校验CRCBuffer2 = ACS510_CRC(CRCBuffer1, WRcmd)Rem 计算读写地址高半字节的校验If ReadAddressHi = "00" ThenReadAddressHi = ""CRCBuffer3 = CRCBuffer2ElseCRCBuffer3 = ACS510_CRC(CRCBuffer2, Tran_HD(WRAddressHi))End IfRem 计算读写地址低半字节的校验CRCBuffer4 = ACS510_CRC(CRCBuffer3, Tran_HD(WRAddressLo))Rem 计算读写数据高半字节的校验If DataHi = "00" ThenCRCBuffer5 = CRCBuffer4DataHi = ""ElseCRCBuffer5 = ACS510_CRC(CRCBuffer4, Tran_HD(DataHi))End IfRem 计算读写数据低半字节的校验,既最终的校验CRC = Trim(Tran_Format(Hex(ACS510_CRC(CRCBuffer5, Tran_HD(DataLo))))) Rem 取校验的高半字节CRCHi = Trim(Mid$(CRC, 1, 2))Rem 取校验的低半字节CRCLo = Trim(Mid$(CRC, 3, 2))Rem 重新组合校验的结果CRC_Even = CRCLo + CRCHiRem 返回发送字符串ACS510_Cmd = StatID + Cmd + WRAddressHi + WRAddressLo + DataHi + DataLo + CRC_EvenEnd Function。
用查表法计算CRC码的CRC校验软件设计通信0903班、学号0909091609、姓名陈洪亮;指导老师:王国才,杨政宇1.设计目标用查表法计算CRC码的CRC校验软件设计。
2.设计原理和方法原理循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。
它是利用除法及余数的原理来作错误侦测(Error Detecting)的。
实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。
CRC32循环冗余校验标准多项为CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1其对应的数字就为:1 0000 0100 1100 0001 0001 1101 1011 0111也就是0x04C11DB7 (多项式对应的数字可能颠倒,颠倒后得到的是0Xedb88320,其实也是正确的)。
CRC32 要求输入的字节要颠倒,那么在程序中,在对每个字节处理前,还要先把这个字节先颠倒一下,再处理,那很麻烦。
所以就把“直接查表法”算法颠倒一下(查询表颠倒),那么算法就可以直接处理不颠倒的字节了,就方便多了。
比如,直接查询表的[01H]= 04C11DB7H,因为 01H 镜像后是 80H,04C11DB7H 镜像后是 EDB88320H,就得到正规查询表的[80H]= EDB88320H。
举例来说,假设待测的原始数据是 10H,简单起见,不考虑寄存器移出的字节的影响(即假设它是 00H)“直接查表法”,原始数据先颠倒为 01H,根据 01H 查表得 04C11DB7H,寄存器移出的字节是向左移。
“颠倒查表法”,直接根据原始数据 10H 查表得 EDB88320H,寄存器移出的字节是向右移。
可见,这时这二个方法本质上是一样的。
方法首先是表的生成,查表法一次处理一个字节的数据,所以crc32表有256个项(2^8),crc32多项式自己与自己异或,使左移出去的8位数字,为0到255,然后剩余的的值作为直接查表法表项。
用VB6.0实现两机串口通讯及CRC16校验
费春国;白瑞祥
【期刊名称】《天津科技大学学报》
【年(卷),期】2002(000)004
【摘要】介绍了当一台PC机作为上位机,另一台PC机作为下位机操作站时,如何用可视化编程语言VB6.0中的MSComm控件实现两机通讯,并用循环冗余校验码CRC16进行校验.已达到上、下位机可靠通讯.
【总页数】3页(P47-49)
【作者】费春国;白瑞祥
【作者单位】天津科技大学自动化工程系,天津,300222;天津科技大学自动化工程系,天津,300222
【正文语种】中文
【中图分类】TP311.1
【相关文献】
1.VB6.0环境下基于USB的虚拟串口通讯实现 [J], 宁辉;孙学艳;刘建;张建国
2.基于VB6.0的PC机与单片机串口通讯的实现 [J], 魏延萍
3.使用西门子S7-300 PLC指针实现CRC16校验计算 [J], 郭海洋
4.利用VB6.0实现PC机与单片机的串口通讯 [J], 付旭;方康玲
5.CRC16校验码移位算法及VHDL实现 [J], 王玉玲;王燕锋;
因版权原因,仅展示原文概要,查看原文内容请购买。