我正在尝试找出串行控制设备的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>
提前感谢!
您应该查看您的字符串Send
,以确保它是您想要的。不是。其构造需要为:
Send = Chr(&H0) & Chr(&H17) &
...
然后您会得到所需的答案。
顺便说一句,您正在计算的东西绝不是CRC。编写该公式的人都不知道他们在说什么。他们构造的是糟糕的校验值算法,因此他们也不知道自己在做什么。