首页 > 解决方案 > CRC计算错误输出

问题描述

我正在尝试找出串行控制设备的 CRC 检查。我有一个示例,当我将此示例发送到设备时,它会正确响应。

这是设备响应的完整串行字符串:

\x00\x17\x3d\x30\x32\x32\x30\x39\x39\x30\x30\x30\x30\x30\x30\x30\x30\x30\x37\x34\x30\x30\x30\x30\x30\x01\x28

(最后 2 个字节 ( \x01\x28) 是 CRC 结果)。

这是我的代码:

Dim Send As String
Dim CRC1 As String
Dim CRC2 As String
Dim TEMP As String

Private Sub Command1_Click()

Send = &H0 & &H17 & "=" & "022" & "099" & "00" & "00" & "0000074" & "00000"

CRC1 = &H0
CRC2 = &H0
TEMP = &H0

For i = 1 To Len(Send)
    TEMP = CRC1
    CRC1 = CRC2 Xor Asc(Mid$(Send, i, 1))
    CRC2 = TEMP
   
Next i

Text1.Text = "CRC1= " & CRC1 & " / CRC2= " & CRC2

End Sub

输出应该是:(CRC1 = 1十进制)和CRC2 = 40(十进制)但我得到51/ 60

我认为这与数据类型有关。

这是设备的原始 CRC 公式:

Set <CRC1> and <CRC2> to zero.
For every <CHAR> in <MSG> do
<TEMP> = <CRC1>
<CRC1> = <CRC2> XOR <CHAR>
<CRC2> = <TEMP>

提前致谢!

标签: vb6crc

解决方案


您应该查看您的字符串Send以确保它是您想要的。它不是。其建设需要:

Send = Chr(&H0) & Chr(&H17) &...

然后你会得到你正在寻找的答案。

顺便说一句,您正在计算的东西绝不是CRC。写这个公式的人不知道他们在说什么。他们构建的是一个糟糕的校验值算法,所以他们也不知道自己在做什么。


推荐阅读