问题是这样,我串口收到字符串get_rev$ = "D4D415170091BA471901120A0110002600B20A0000F60412"D4为一个字节,D4为一个字节,15为一个字节......,最终倒数3、4位04为一个字节,字符串最后12为校验和占1个字节从D4到最后04 要做字节的异或,得出结果,如果和最后校验位相等,表示数据收全了,如果没有,那么还得继续读数。
VC里有函数atoi可以把D4放到一个内存空间里,然后D4和D4异或,依次再和15异或可是VB里如何解决呢????????????????????????????
VC里有函数atoi可以把D4放到一个内存空间里,然后D4和D4异或,依次再和15异或可是VB里如何解决呢????????????????????????????
Dim str As String, sh As String * 1, sl As String * 1
Dim CurrentXor As Integer, ArmXor As Integer, temp As Integer
str = "D4D415170091BA471901120A0110002600B20A0000F60412"
sh = Mid(str, Len(str) - 1, 1)
sl = Mid(str, Len(str), 1)
ArmXor = HextoNum(sh, sl) '先求取末尾两位的值,放入ArmXor
str = Mid(str, 1, Len(str) - 2) '截去末尾两位
CurrentXor = 0
Do While (Len(str) <> 0)
sh = Mid(str, 1, 1)
sl = Mid(str, 2, 1)
temp = HextoNum(sh, sl) '求取最前面两位的值
If temp > 255 Then Exit Do 'temp>255 说明数据非HEX码
CurrentXor = CurrentXor Xor temp '与CurrentXor异或后放入CurrentXor
str = Mid(str, 3, Len(str) - 2) '截去最前面两位
Loop
If (CurrentXor <> ArmXor Or temp > 255) Then Print False Else Print True
End SubPrivate Function HextoNum(sh As String, sl As String) '将两位HEX码转换成十进数值
Dim sum As Integer, n As Integer
n = Change(sh)
If n > 15 Then HextoNum = 1000 Else HextoNum = n * 16
n = Change(sl)
If n > 15 Then HextoNum = 1000 Else HextoNum = HextoNum + n
End FunctionPrivate Function Change(s As String) '将一位HEX码转换成十进数值
Select Case s
Case "0" To "9": Change = Asc(s) - 48
Case "A" To "F": Change = Asc(UCase(s)) - 55
Case Else: Change = 100 '非HEX码
End Select
End Function
Option Explicit
Dim get_rev As String
Dim i As Integer
Dim jyh As Integer
Private Sub Command1_Click()
jyh = Val("&H" & Mid(get_rev, 1, 2))
For i = 3 To Len(get_rev) - 2 Step 2
jyh = jyh Xor Val("&H" & Mid(get_rev, i, 2))
Next
jyh = jyh
Text2 = Hex(jyh Mod 256)
End SubPrivate Sub Form_Load()
get_rev = "D4D415170091BA471901120A0110002600B20A0000F60412"
Text1 = get_rev
End Sub经XOR校验和检验获得&H13与最后字节&H12不符合.
Xor &H1 Xor &H10 Xor &H0 Xor &H26 Xor &H0 Xor &HB2 Xor &HA Xor &H0 Xor &HF6 Xor &H4结果是10进制19,16进制为&H13
Dim i As Long, c As Byte, n As Byte
For i = 1 To Len(s) - 2 Step 2
c = c Xor CByte("&H" & Mid$(s, i, 2))
Next
IsEnd = (c = CByte("&H" & Mid$(s, i, 2)))
End Function'调用
Debug.Print IsEnd("D4D415170091BA471901120A0110002600B20A0000F60412")
Private Sub Form_Load()
Dim i As Long
Dim arr() As String
Dim str As String
str = "D4D415170091BA471901120A0110002600B20A0000F60412"
str = Mid(str, 1, Len(str) - 2)
Do While Len(str) >= 2
ReDim Preserve arr(i)
arr(i) = "&H" & Left(str, 2)
str = Mid(str, 3, Len(str) - 2)
If i <> 0 Then
arr(i) = CStr(Val(arr(i)) Xor Val(arr(i - 1)))
End If
i = i + 1
Loop
'arr(i - 1) = CStr(Hex(Val(arr(i - 1))))
arr(i - 1) = "&H" & CStr(Hex(Val(arr(i - 1))))
Debug.Print arr(i - 1)
End Sub结果是&H13