vb 接收到下位机数据后解析的问题

时间:2022-02-26 23:42:18
我收到的数据为  5  3  A  0 7C  0 75  0 76  0 77  0 79  86  4  而我只要0 7C  0 75  0 76  0 77  0 79这几个数据
例如:0 7c 先合并成一个数07c 然后转换成十进制温度值为 12.4°C 

Private Sub MSComm1_OnComm()
Dim i As Long
Dim inData() As Byte

MSComm1.InputMode = comInputModeBinary
If MSComm1.InBufferCount > 0 Then
inData = MSComm1.Input
For i = 0 To UBound(inData)
*************** 此处转化不会了,该怎么写,请各位帮帮忙。

    
Next i
End If
End Sub

19 个解决方案

#1


给你个例子,参考一下:

Option Explicit
'建议你改成这个样子
Dim ReadByte(0 To 99) As Byte       '接收字节数组
Private Sub Form_Load()
    With MSComm1
        .CommPort = 1
        .InputLen = 1
        .Settings = "9600,N,8,1"
        .RThreshold = 1
        .InputMode = comInputModeBinary
    End With
End Sub

Private Sub MSComm1_OnComm()
    Dim intP As Integer
    Dim varP As Variant
    MSComm1.RThreshold = 0 '屏蔽OnComm事件的发生
    intP = 0
    Do
        varP = MSComm1.Input
        If Not IsNull(varP) Then ReadByte(intP) = varP(0)
    Loop Until MSComm1.InBufferCount = 0
    '完成通信,处理数据
    '取出ReadByte的第3、4个元素即可(起始是第0个)
    
End Sub

#2


先谢谢你。 
If Not IsNull(varP) Then ReadByte(intP) = varP(0)
    Loop Until MSComm1.InBufferCount = 0
 这段代码是什么意思,我有点看不懂,能解释一下吗? 就是我上面说得,解析成我要的那种格式后,每个温度值要放入一个textbox中。。  就是这个地方,我不会了。不知道该怎么解析,我解析过,但是出来的数据都和以前的不对应了。。。

#3


0 :应该是正负的表达,0 表示正
7C:十六进制数据,转换成十进制是:124 也就是 12.4的一个表示

07C转换过来应该就是:+12.4℃

#4


你可以变化一个温度,看看和我的解释是否相符合,我是分析加猜测哈,呵呵

#5


嗯对的,现在还没接电阻,如果接上得话测温范围比这个高。。一般都是  2E 7A 这类型的数据,比如2E 7A 转换成十进制11898 万位1代表正 0代表负 就是正189.8

#6


前辈,我遇到的问题就是不知道该如何解析这里。。。 不知道该怎么把这个数据解析成我想要的,我解析了好久了,都不对,帮帮我好吗?感激不尽啊!!!呜呜呜·~·

#7


你的数据到底是:
53 A0 7C....
还是:
5 3 A 0 7C 0 75  
也就是说5到底是05 还是53?

#8


5      3       A    0  7c   0  75      不是53 。。5是05  3是03  A 是 A    

#9


就你提供的信息,我能分析的就这么多了。你使用串口调试器试一试嘛
我就纳闷儿了,调试串口通信,没有通信协议吗?看看通信协议不就OK了吗?

#10


前辈,你还没明白我的意思呀。。嘿嘿 通信没问题呀,收到的数据也是对的。跟下位机要求的格式一样。
比如说我上面代码中* 号处的 Text1.Text = Text1.Text & Hex(inData(i)) & " " 出来的数据就是
 5 3 A 0 7C 0 75 0 76 0 77 0 79 86 4   但是不能把这个数据放入文本框叫用户看吧?人家看不懂呀? 咱们要解析成我说的那种格式 比如 12.4°C  用户才能看懂啊。 我现在就是这里不会,我不知道该如何把这一串数据解析成我要的格式。。

#11


前辈,通信已经成功了,格式也对的。比如上面我代码中*号处 我的Text1.Text = Text1.Text & Hex(inData(i)) & " "  出来的数据就是5 3 A 0 7C 0 75 0 76 0 77 0 79 86 4   但是咱不能把这串数据放入文本框给用户看吧,咱们要解析成我说得那种格式,用户才可以看懂啊。我就是这里不会啦,解析不出来。。。 不知道怎么做才能解析成我说的那种格式。。比如0 7c 解析成 12.4

#12


这烂路由器,老是连接不上,还得我发了两遍

#13


我狂晕
不就是怎么讲00 7C转换?
就拿7C来说吧,Val("&H" & "7C")
转换出来是124 你自己再变换一下就OK了

#14


前辈我也狂晕啊, 你知道吗,我按照你说得那样解析过。。但是出来的数据错了。那一串数字存在数组里面的,一个字节为一个元素,我从下标0开始取元素,取出来就不对,我郁闷了两天了。如果今天在不弄好,我都想卷铺盖回家放牛去了。

#15


引用 14 楼 wxandmaomao 的回复:
前辈我也狂晕啊, 你知道吗,我按照你说得那样解析过。。但是出来的数据错了。那一串数字存在数组里面的,一个字节为一个元素,我从下标0开始取元素,取出来就不对,我郁闷了两天了。如果今天在不弄好,我都想卷铺盖回家放牛去了。

得先将接收的字节流数据转换成16进制字符串,然后按协议用Mid函数取数据进行数据处理.
Private Sub MSComm1_OnComm() '接收数据
    Dim strBuff As String
    Select Case MSComm1.CommEvent
        Case 2
            MSComm1.InputLen = 0
            strBuff = MSComm1.Input
            BytReceived() = strBuff
            jieshou
            lenInput = Len(strData)
            Text2 = lenInput \ 2
            '数据处理代码
    End Select
End Sub

Public Function jieshou() '接收数据处理为16进制
    Dim i As Integer
    For i = 0 To UBound(BytReceived)
        If Len(Hex(BytReceived(i))) = 1 Then
            strData = strData & "0" & Hex(BytReceived(i))
        Else
            strData = strData & Hex(BytReceived(i))
        End If
    Next
    txtReceive = strData
End Function

详细可参阅: http://www.vbgood.com/thread-83700-1-1.html

#16


有没有通信协议?

#17


有  主站请求:
    [img=C:\Documents and Settings\Administrator\桌面][/img]
    从站响应:
    [img=C:\Documents and Settings\Administrator\桌面][/img]

#18


麻烦你了。估计是我程序的问题吧,结贴了。谢谢你。 如果你有空,可以加我QQ吗,指导我一下。我的QQ360115572

#19


问题的关键在于理解透彻通信协议

#1


给你个例子,参考一下:

Option Explicit
'建议你改成这个样子
Dim ReadByte(0 To 99) As Byte       '接收字节数组
Private Sub Form_Load()
    With MSComm1
        .CommPort = 1
        .InputLen = 1
        .Settings = "9600,N,8,1"
        .RThreshold = 1
        .InputMode = comInputModeBinary
    End With
End Sub

Private Sub MSComm1_OnComm()
    Dim intP As Integer
    Dim varP As Variant
    MSComm1.RThreshold = 0 '屏蔽OnComm事件的发生
    intP = 0
    Do
        varP = MSComm1.Input
        If Not IsNull(varP) Then ReadByte(intP) = varP(0)
    Loop Until MSComm1.InBufferCount = 0
    '完成通信,处理数据
    '取出ReadByte的第3、4个元素即可(起始是第0个)
    
End Sub

#2


先谢谢你。 
If Not IsNull(varP) Then ReadByte(intP) = varP(0)
    Loop Until MSComm1.InBufferCount = 0
 这段代码是什么意思,我有点看不懂,能解释一下吗? 就是我上面说得,解析成我要的那种格式后,每个温度值要放入一个textbox中。。  就是这个地方,我不会了。不知道该怎么解析,我解析过,但是出来的数据都和以前的不对应了。。。

#3


0 :应该是正负的表达,0 表示正
7C:十六进制数据,转换成十进制是:124 也就是 12.4的一个表示

07C转换过来应该就是:+12.4℃

#4


你可以变化一个温度,看看和我的解释是否相符合,我是分析加猜测哈,呵呵

#5


嗯对的,现在还没接电阻,如果接上得话测温范围比这个高。。一般都是  2E 7A 这类型的数据,比如2E 7A 转换成十进制11898 万位1代表正 0代表负 就是正189.8

#6


前辈,我遇到的问题就是不知道该如何解析这里。。。 不知道该怎么把这个数据解析成我想要的,我解析了好久了,都不对,帮帮我好吗?感激不尽啊!!!呜呜呜·~·

#7


你的数据到底是:
53 A0 7C....
还是:
5 3 A 0 7C 0 75  
也就是说5到底是05 还是53?

#8


5      3       A    0  7c   0  75      不是53 。。5是05  3是03  A 是 A    

#9


就你提供的信息,我能分析的就这么多了。你使用串口调试器试一试嘛
我就纳闷儿了,调试串口通信,没有通信协议吗?看看通信协议不就OK了吗?

#10


前辈,你还没明白我的意思呀。。嘿嘿 通信没问题呀,收到的数据也是对的。跟下位机要求的格式一样。
比如说我上面代码中* 号处的 Text1.Text = Text1.Text & Hex(inData(i)) & " " 出来的数据就是
 5 3 A 0 7C 0 75 0 76 0 77 0 79 86 4   但是不能把这个数据放入文本框叫用户看吧?人家看不懂呀? 咱们要解析成我说的那种格式 比如 12.4°C  用户才能看懂啊。 我现在就是这里不会,我不知道该如何把这一串数据解析成我要的格式。。

#11


前辈,通信已经成功了,格式也对的。比如上面我代码中*号处 我的Text1.Text = Text1.Text & Hex(inData(i)) & " "  出来的数据就是5 3 A 0 7C 0 75 0 76 0 77 0 79 86 4   但是咱不能把这串数据放入文本框给用户看吧,咱们要解析成我说得那种格式,用户才可以看懂啊。我就是这里不会啦,解析不出来。。。 不知道怎么做才能解析成我说的那种格式。。比如0 7c 解析成 12.4

#12


这烂路由器,老是连接不上,还得我发了两遍

#13


我狂晕
不就是怎么讲00 7C转换?
就拿7C来说吧,Val("&H" & "7C")
转换出来是124 你自己再变换一下就OK了

#14


前辈我也狂晕啊, 你知道吗,我按照你说得那样解析过。。但是出来的数据错了。那一串数字存在数组里面的,一个字节为一个元素,我从下标0开始取元素,取出来就不对,我郁闷了两天了。如果今天在不弄好,我都想卷铺盖回家放牛去了。

#15


引用 14 楼 wxandmaomao 的回复:
前辈我也狂晕啊, 你知道吗,我按照你说得那样解析过。。但是出来的数据错了。那一串数字存在数组里面的,一个字节为一个元素,我从下标0开始取元素,取出来就不对,我郁闷了两天了。如果今天在不弄好,我都想卷铺盖回家放牛去了。

得先将接收的字节流数据转换成16进制字符串,然后按协议用Mid函数取数据进行数据处理.
Private Sub MSComm1_OnComm() '接收数据
    Dim strBuff As String
    Select Case MSComm1.CommEvent
        Case 2
            MSComm1.InputLen = 0
            strBuff = MSComm1.Input
            BytReceived() = strBuff
            jieshou
            lenInput = Len(strData)
            Text2 = lenInput \ 2
            '数据处理代码
    End Select
End Sub

Public Function jieshou() '接收数据处理为16进制
    Dim i As Integer
    For i = 0 To UBound(BytReceived)
        If Len(Hex(BytReceived(i))) = 1 Then
            strData = strData & "0" & Hex(BytReceived(i))
        Else
            strData = strData & Hex(BytReceived(i))
        End If
    Next
    txtReceive = strData
End Function

详细可参阅: http://www.vbgood.com/thread-83700-1-1.html

#16


有没有通信协议?

#17


有  主站请求:
    [img=C:\Documents and Settings\Administrator\桌面][/img]
    从站响应:
    [img=C:\Documents and Settings\Administrator\桌面][/img]

#18


麻烦你了。估计是我程序的问题吧,结贴了。谢谢你。 如果你有空,可以加我QQ吗,指导我一下。我的QQ360115572

#19


问题的关键在于理解透彻通信协议