我从下位机接收到一串数据。现在想把它转换成10进制数
转换思想:相邻两位从后至前转换
程序代码如下:
Dim acout1, acout11, acout2, acout22, bcout1, bcout11, bcout2, bcout22, kcout1, kcout2 As String
Dim acoutf, acoutft, acouts, bcoutf, bcouts, kcout As Long
strdata = ""    '接收到的字符串
For i = LBound(inbyte) To UBound(inbyte)
If Len(Hex(inbyte(i))) = 1 Then
strdata = strdata & "0" & Hex(inbyte(i)) & " "
Else
strdata = strdata & Hex(inbyte(i)) & " "
End If
Next i
acout1 = Mid(strdata, 1, 2) '取字符串acout11 = Mid(strdata, 4, 2)
acout2 = Mid(strdata, 7, 2)
acout22 = Mid(strdata, 10, 2)
bcout1 = Mid(strdata, 13, 2)
bcout11 = Mid(strdata, 16, 2)
bcout2 = Mid(strdata, 19, 2)
bcout22 = Mid(strdata, 22, 2)
kcout1 = Mid(strdata, 25, 2)
kcout2 = Mid(strdata, 28, 2)acoutf = Val("&H" & (acout11 & acout1)) '数值转换End If
acouts = Val("&H" & (acout22 & acout2))bcoutf = Val("&H" & (bcout11 & bcout1))bcouts = Val("&H" & (bcout22 & bcout2))
kcout = Val("&H" & (kcout2 & kcout1))当kcout=32768后 ,程序就出现负值,请教哪里出错了。谢谢

解决方案 »

  1.   

    kcout = Val("&H" & (kcout2 & kcout1) &"&") 
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 
    http://feiyun0112.cnblogs.com/
      

  2.   


    acoutf = Val("&H" & (acout11 & acout1)) '数值转换 
    将上句改为下句
    acoutf = Val("&H" & acout11 & acout1 & "&") '数值转换
      

  3.   

    谢谢上面的朋友
    我还要增加个问题:
    kcout = Val("&H" & (kcout2 & kcout1)) 
    当kcout2=FF
    kcout1=FF后
    下位机发送数据又从零开始发
    而我转换的数据也从零开始了
    如何让它在第一次的基础上累加啊?即 65536+kcout
      

  4.   

    kcout声明为静态变量,当kcout2=FF kcout1=FF后 跳转回去
      

  5.   

    楼上的朋友
    是这样的,下位机每两秒发送采集到的数据,例如“01 02 03 04 05 06 FF FF 09”字符串
    我通过VB把这些字符串依次进行这样的数制转换 :如:第一个数:0201(16) = 513(10)
                                            第二个数:0403(16)  =1027(10)
                                            第三个数:0605(16)=1541(10)
                                            第四个数:FFFF(16)=65535(10)现在的问题是,第四个数达到了FFFF,此时不一定等于FFFF。又重新从小往大增加,而且没有进位标志。如何编程使得现在采集到的数据不是当前数据,而是在第一个65536基础上累加的?
      

  6.   


    不过有一点,没必要把接收到的数据转换成字符串,再转回数字,中间还插空格。字符串处理是最慢的。acouts = inbyte(3) * 256 + inbyte(2)
    bcoutf = inbyte(1) * 256 + inbyte(0)
    bcouts = inbyte(5) * 256 + inbyte(4)
    kcout = inbyte(7) * 256 + inbyte(6)
      

  7.   

    LZ:
    从你的叙述看,通信协议制定不严密。
    下位机每两秒发送的数据为“01 02 03 04 05 06 FF FF 09”
    共9字节,哪是首字节?每次返回的数据应该是规定字节长度,应有明确的格式。我不知道此协议可否修改,适当增加字节数来确保数据通信的可靠收发。将存在超过65535整数采用4字节的Long 数据类型,32 位(4 个字节)有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647,能绝对满足你数据可靠接收。而且不会增加通信负担。因为你的下位机每两秒发送一次数据,它对于波特率为9600时,每秒可传递960字节的数据,足足有余。
    按你现在的考虑,它会受到通信出错而造成无法正确进行数据接收和处理。
      

  8.   


    楼主别介意,为了改进,挑毛病:strdata = ""    '接收到的字符串 
    For i = LBound(inbyte) To UBound(inbyte) 
    If Len(Hex(inbyte(i))) = 1 Then                     '这里先做了一次字符转换,仅仅为了测试长度
    strdata = strdata & "0" & Hex(inbyte(i)) & " "      '实际转换时又做了一次
    Else 
    strdata = strdata & Hex(inbyte(i)) & " " 
    End If 
    Next i 我习惯这样:
    strdata = ""    '接收到的字符串 
    For i = LBound(inbyte) To UBound(inbyte)
        strdata = strdata & Right("0" & Hex(inbyte(i)), 2) & " "
    Next i 或者
    Dim tmp As String
    strdata = ""    '接收到的字符串 
    For i = LBound(inbyte) To UBound(inbyte)
        tmp = Hex(inbyte(i))
        strdata = strdata & IIf(len(tmp) = 1, "", "0") & tmp & " "
    Next i 其次
    Dim tmp As String
    strdata = ""    '接收到的字符串 
    For i = LBound(inbyte) To UBound(inbyte)
        tmp = Hex(inbyte(i))
        If Len(tmp)) = 1 Then 
             strdata = strdata & "0" & tmp & " "
         Else 
            strdata = strdata & tmp & " " 
        End If
    Next i
      

  9.   

    To of123:
    牛人,谢谢你,的确你的代码要简洁很多。今后还需要你的指导。To zdingyun:
    牛人,也谢谢你。现在的问题就是没办法改变通信协议,只能在VB上进行判断接收到的数据是否超过了FFFF,如果超过1次就加65536,超过2次就加2*65536
    该怎么做啊??能不能给个代码参考一下。谢谢回复的兄弟们!
      

  10.   

    问题是
    1)你最终允许几次?
    2)出现通信出错会引起数据出错
    假如通信是绝对不出错的话
    1)需设置
         MSComm1.RThreshold = 9
        MSComm1.InputMode = comInputModeBinary '二进制接收
    2)使用MsComm1_OnComm接收
    Private Sub MSComm1_OnComm()
        Dim bytInput() As Byte
        Static sum As Integer
        Select Case Me.MSComm2.CommEvent
            Case comEvReceive
                '处理接收的代码
                intInputLen = Me.MSComm1.InBufferCount
                ReDim bytInput(intInputLen)
                bytInput = Me.MSComm2.Input
                Dim i As Integer
                For i = 0 To UBound(bytInput)
                    If Len(Hex(bytInput(i))) = 1 Then
                        strData = strData & "0" & Hex(bytInput(i))
                    Else
                        strData = strData & Hex(bytInput(i))
                    End If
                Next
                If (strData) = 18 Then
                    sj4 = Mid(strData, 13, 4)   '第四个数:FFFF(16)=65535(10)
                    If sj4 = "FFFF" Then
                        sum = sum + 1 '判断"FFFF"次数
                    End If
                    If sum = 1 Then
                        kcout4 = Val("&H" & sj4 & "&")
                    ElseIf sum = 2 Then
                        kcout4 = Val("&H" & sj4 & "&") + 65536
                    ElseIf sum = 3 Then
                        kcout4 = Val("&H" & sj4 & "&") + 65536 * 2
                        sum = sum - 3
                    End If
                End If
        End Select
    End Sub没有确切的通信协议,仅供参考
      

  11.   

    Private Sub MSComm1_OnComm()
        Dim bytInput() As Byte
        Static sum As Integer
        Select Case Me.MSComm2.CommEvent
            Case comEvReceive
                '处理接收的代码
                intInputLen = Me.MSComm1.InBufferCount
                ReDim bytInput(intInputLen)
                bytInput = Me.MSComm2.Input
                Dim i As Integer
                For i = 0 To UBound(bytInput)
                    If Len(Hex(bytInput(i))) = 1 Then
                        strData = strData & "0" & Hex(bytInput(i))
                    Else
                        strData = strData & Hex(bytInput(i))
                    End If
                Next
                If (strData) = 18 Then
                    sj4 = Mid(strData, 13, 4)   '第四个数:FFFF(16)=65535(10)
                    If sj4 = "FFFF" Then
                        sum = sum + 1 '判断"FFFF"次数
                    End If
                    If sum = 1 Then
                        kcout4 = Val("&H" & sj4 & "&")
                    ElseIf sum = 2 Then
                        kcout4 = Val("&H" & sj4 & "&") + 65536
                    ElseIf sum = 3 Then
                        kcout4 = Val("&H" & sj4 & "&") + 65536 * 2
                        sum = sum - 3
                    End If
                    strData = ""
                End If
        End Select
    End Sub