我从下位机接收到一串数据。现在想把它转换成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后 ,程序就出现负值,请教哪里出错了。谢谢
转换思想:相邻两位从后至前转换
程序代码如下:
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后 ,程序就出现负值,请教哪里出错了。谢谢
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
acoutf = Val("&H" & (acout11 & acout1)) '数值转换
将上句改为下句
acoutf = Val("&H" & acout11 & acout1 & "&") '数值转换
我还要增加个问题:
kcout = Val("&H" & (kcout2 & kcout1))
当kcout2=FF
kcout1=FF后
下位机发送数据又从零开始发
而我转换的数据也从零开始了
如何让它在第一次的基础上累加啊?即 65536+kcout
是这样的,下位机每两秒发送采集到的数据,例如“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基础上累加的?
不过有一点,没必要把接收到的数据转换成字符串,再转回数字,中间还插空格。字符串处理是最慢的。acouts = inbyte(3) * 256 + inbyte(2)
bcoutf = inbyte(1) * 256 + inbyte(0)
bcouts = inbyte(5) * 256 + inbyte(4)
kcout = inbyte(7) * 256 + inbyte(6)
从你的叙述看,通信协议制定不严密。
下位机每两秒发送的数据为“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字节的数据,足足有余。
按你现在的考虑,它会受到通信出错而造成无法正确进行数据接收和处理。
楼主别介意,为了改进,挑毛病: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
牛人,谢谢你,的确你的代码要简洁很多。今后还需要你的指导。To zdingyun:
牛人,也谢谢你。现在的问题就是没办法改变通信协议,只能在VB上进行判断接收到的数据是否超过了FFFF,如果超过1次就加65536,超过2次就加2*65536
该怎么做啊??能不能给个代码参考一下。谢谢回复的兄弟们!
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没有确切的通信协议,仅供参考
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