×

MODBUS的CRC校验和程序(VB编制)

Kalet Kalet 发表于2009-05-31 11:16:08 浏览493 评论0

抢沙发发表评论

 modbus协议做为一种通用协议得到了广泛的应用,它有两种传输模式:ASCII和RTU。ASCII模式采用LRC校验,RTU模式采用CRC校验。
本篇文章来源于

    CRC方法错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。
    使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。
    CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
    CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
    CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。
    CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。
    下面是用VB实现的CRC校验和程序:
    Function CRC16(data() As Byte) As String ’CRC计算函数
      Dim CRC16Lo As Byte, CRC16Hi As Byte   ’CRC寄存器
      Dim CL As Byte, CH As Byte            ’多项式码&HA001
      Dim SaveHi As Byte, SaveLo As Byte
      Dim I As Integer
      Dim Flag As Integer
      CRC16Lo = &HFF
      CRC16Hi = &HFF
      CL = &H1
      CH = &HA0
      For I = 0 To UBound(data)
          CRC16Lo = CRC16Lo Xor data(I) ’每一个数据与CRC寄存器进行异或
          For Flag = 0 To 7
          SaveHi = CRC16Hi
          SaveLo = CRC16Lo
          CRC16Hi = CRC16Hi \ 2            ’高位右移一位
          CRC16Lo = CRC16Lo \ 2            ’低位右移一位
          If ((SaveHi And &H1) = &H1) Then ’如果高位字节最后一位为1
            CRC16Lo = CRC16Lo Or &H80      ’则低位字节右移后前面补1
          End If                           ’否则自动补0
          If ((SaveLo And &H1) = &H1) Then ’如果LSB为1,则与多项式码进行异或
            CRC16Hi = CRC16Hi Xor CH
            CRC16Lo = CRC16Lo Xor CL
          End If
        Next Flag
      Next I
      Dim ReturnData(1) As Byte
      ReturnData(0) = CRC16Hi              ’CRC高位
      ReturnData(1) = CRC16Lo              ’CRC低位
      asd = Right("00" + Hex(CRC16Lo), 2) + Right("00" + Hex(CRC16Hi), 2)
    End Function
 

群贤毕至

访客