在VB 环境下怎样实现CRC (CCITT)?

时间:2021-08-30 16:39:43
在网上看了太多的那个反转多项式的代码,但都和正确结果不对应呢.很困惑.
想问问各位大牛们,应该怎么解决这个问题
我在串口通信中应用,就是就几个字节的16进制数据,需要加上CRC校验码之后再发送
help me 
谢谢

16 个解决方案

#2


谢谢楼上的
可我需要的是应用于串口通信的啊
就是有几个字节的十六进制数据,然后进行CRC(CCITT)的校验

#3


Option Explicit

'CRC校验函数
Function CRC16(Coun() As Byte) As Long
    Dim intBit, intTemp As Integer
    Dim lonCRC As Long
    Dim intCnt As Long
    lonCRC = &HFFFF&
    For intCnt = 0 To UBound(Coun) - 2
        lonCRC = lonCRC Xor Coun(intCnt)
        For intBit = 0 To 7
            intTemp = lonCRC Mod 2
            lonCRC = lonCRC \ 2
            If intTemp = 1 Then
                lonCRC = lonCRC Xor &HA001&
            End If
        Next intBit
    Next intCnt
    CRC16 = lonCRC
End Function

Private Sub Command1_Click()
    Dim longCRC As Long               '定义校验变量
    Dim aa(7) As Byte                 '定义动态数组
      aa(0) = &H1                                        '地址
      aa(1) = &H3                                        '功能码 读
      aa(2) = &H0                                        '起始地址
      aa(3) = &HA
      aa(4) = &H0                                        '数据点数
      aa(5) = &H8
    longCRC = CRC16(aa)                                    'CRC校验
    aa(UBound(aa) - 1) = longCRC Mod 256
    aa(UBound(aa)) = longCRC \ 256
    MSComm1.OutBufferCount = 0                             '清空输出寄存器
    MSComm1.Output = aa                                    '发送
End Sub

Private Sub Form_Load()
    MSComm1.PortOpen = True
End Sub

#5


谢谢zdingyun
我还是自己先试试看
看上面的帖子,多项式还是&HA001
而CCITT的标准是反相多项式为&H8408

#6


该代码执行结果与COMMIX的CRC16(MODBUSRTU)检验输出相同

#7


引用 2 楼 gabriel721 的回复:
谢谢楼上的 
可我需要的是应用于串口通信的啊 
就是有几个字节的十六进制数据,然后进行CRC(CCITT)的校验


我眼花了.....不好意思-_-b

#8


唉,今天试了一下上面的程序,好象还是不行啊
我的十六进制数据为 07 15 12 34 56 78 00,看网上最通用的那个程序,用&H8408为反相多项式代替&HA001
算得结果为15 48
也不知道正确与否
希望各位帮帮我

#9


引用 8 楼 gabriel721 的回复:
唉,今天试了一下上面的程序,好象还是不行啊 
我的十六进制数据为 07 15 12 34 56 78 00,看网上最通用的那个程序,用&H8408为反相多项式代替&HA001 
算得结果为15 48 
也不知道正确与否 
希望各位帮帮我

LZ,下午网上搜索以下,CRC(CCITT)校验的内容能解决问题的没有.
再DING下,期待高手出现.

#10


唉,我也是很无助啊,急切需要人帮助
谢谢楼上的

#11


给大家介绍一个VB的源码站

或许那里能帮到你!

恶魔界

#12


该回复于2008-11-11 11:41:38被版主删除

#13


该回复于2008-11-11 11:41:36被版主删除

#14


该回复于2008-11-11 11:41:34被版主删除

#15


谢谢各位的解答,问题已解决。

#16


引用 15 楼  的回复:
谢谢各位的解答,问题已解决。
楼主  我现在要做一个CRC8的校验  也是VB中的  能帮下忙嘛

#1


#2


谢谢楼上的
可我需要的是应用于串口通信的啊
就是有几个字节的十六进制数据,然后进行CRC(CCITT)的校验

#3


Option Explicit

'CRC校验函数
Function CRC16(Coun() As Byte) As Long
    Dim intBit, intTemp As Integer
    Dim lonCRC As Long
    Dim intCnt As Long
    lonCRC = &HFFFF&
    For intCnt = 0 To UBound(Coun) - 2
        lonCRC = lonCRC Xor Coun(intCnt)
        For intBit = 0 To 7
            intTemp = lonCRC Mod 2
            lonCRC = lonCRC \ 2
            If intTemp = 1 Then
                lonCRC = lonCRC Xor &HA001&
            End If
        Next intBit
    Next intCnt
    CRC16 = lonCRC
End Function

Private Sub Command1_Click()
    Dim longCRC As Long               '定义校验变量
    Dim aa(7) As Byte                 '定义动态数组
      aa(0) = &H1                                        '地址
      aa(1) = &H3                                        '功能码 读
      aa(2) = &H0                                        '起始地址
      aa(3) = &HA
      aa(4) = &H0                                        '数据点数
      aa(5) = &H8
    longCRC = CRC16(aa)                                    'CRC校验
    aa(UBound(aa) - 1) = longCRC Mod 256
    aa(UBound(aa)) = longCRC \ 256
    MSComm1.OutBufferCount = 0                             '清空输出寄存器
    MSComm1.Output = aa                                    '发送
End Sub

Private Sub Form_Load()
    MSComm1.PortOpen = True
End Sub

#4


#5


谢谢zdingyun
我还是自己先试试看
看上面的帖子,多项式还是&HA001
而CCITT的标准是反相多项式为&H8408

#6


该代码执行结果与COMMIX的CRC16(MODBUSRTU)检验输出相同

#7


引用 2 楼 gabriel721 的回复:
谢谢楼上的 
可我需要的是应用于串口通信的啊 
就是有几个字节的十六进制数据,然后进行CRC(CCITT)的校验


我眼花了.....不好意思-_-b

#8


唉,今天试了一下上面的程序,好象还是不行啊
我的十六进制数据为 07 15 12 34 56 78 00,看网上最通用的那个程序,用&H8408为反相多项式代替&HA001
算得结果为15 48
也不知道正确与否
希望各位帮帮我

#9


引用 8 楼 gabriel721 的回复:
唉,今天试了一下上面的程序,好象还是不行啊 
我的十六进制数据为 07 15 12 34 56 78 00,看网上最通用的那个程序,用&H8408为反相多项式代替&HA001 
算得结果为15 48 
也不知道正确与否 
希望各位帮帮我

LZ,下午网上搜索以下,CRC(CCITT)校验的内容能解决问题的没有.
再DING下,期待高手出现.

#10


唉,我也是很无助啊,急切需要人帮助
谢谢楼上的

#11


给大家介绍一个VB的源码站

或许那里能帮到你!

恶魔界

#12


该回复于2008-11-11 11:41:38被版主删除

#13


该回复于2008-11-11 11:41:36被版主删除

#14


该回复于2008-11-11 11:41:34被版主删除

#15


谢谢各位的解答,问题已解决。

#16


引用 15 楼  的回复:
谢谢各位的解答,问题已解决。
楼主  我现在要做一个CRC8的校验  也是VB中的  能帮下忙嘛