问题是这样,我串口收到字符串get_rev$ = "D4D415170091BA471901120A0110002600B20A0000F60412"D4为一个字节,D4为一个字节,15为一个字节......,最终倒数3、4位04为一个字节,字符串最后12为校验和占1个字节从D4到最后04 要做字节的异或,得出结果,如果和最后校验位相等,表示数据收全了,如果没有,那么还得继续读数。
VC里有函数atoi可以把D4放到一个内存空间里,然后D4和D4异或,依次再和15异或可是VB里如何解决呢????????????????????????????

解决方案 »

  1.   

    Private Sub Command1_Click()
    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
      

  2.   

    以上使用了自制的HextoNum函数,你试试吧
      

  3.   


    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不符合.
      

  4.   

    D4D415170091BA471901120A0110002600B20A0000F604xor的校验就是12,而不是13
      

  5.   

    Text1 = &HD4 Xor &HD4 Xor &H15 Xor &H17 Xor &H0 Xor &H91 Xor &HBA Xor &H47 Xor &H19 Xor &H1 Xor &H12 Xor &HA _
    Xor &H1 Xor &H10 Xor &H0 Xor &H26 Xor &H0 Xor &HB2 Xor &HA Xor &H0 Xor &HF6 Xor &H4结果是10进制19,16进制为&H13
      

  6.   

    Function IsEnd(ByVal s As String) As Boolean
        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")
      

  7.   


    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