如何用MSCOMM控件完整接收长度不定的十六进制的数据, 100

如何用MSCOMM控件完整接收长度十六进制的数据,该数据长度不定,但都是以“0x1B”开头标识,第四五个字节是整个数据的总长度,最后一位是校验,我在接收的时候也能收到,但... 如何用MSCOMM控件完整接收长度十六进制的数据,该数据长度不定,但都是以“0x1B”开头标识,第四五个字节是整个数据的总长度,最后一位是校验,我在接收的时候也能收到,但我用AccessPort查看的时候发现每次收到的不是一个完整的数据帧,而是被拆分成了几个帧,因为是需要高速连续接收的发送的,所以帧被拆分了很不好处理,效率很低,故求达人解答,提供解决方案。附上我的代码
'////////////////////////////////////////////////////////////////////
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.RThreshold = 1 '产生MSComm事件
MSComm1.InBufferSize = 1024
TxtSend = ""
txtReceive = ""

MSComm1.Settings = C2
MSComm1.CommPort = C1
MSComm1.PortOpen = True
'//////////////////////////////////////////////////////////////////////////
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
展开
 我来答
zirwy
2010-11-24 · TA获得超过493个赞
知道小有建树答主
回答量:86
采纳率:0%
帮助的人:127万
展开全部
你的程序里,MSComm1.RThreshold = 1,就是说每收到一个字节都要产生一次事件,其实这样很简单,一开始将你的MSComm1.RThreshold设为5,判别收到的第一个字节是否正确,正确的话再提取4、5两个字节,得出你的数据长度,然后将MSComm1.RThreshold设为该数据长度+1,因为你说有一个校验的,这样你就能收完整个数据后再触发事件。收到数据后再将MSComm1.RThreshold设为5,收下一批数据。
aalns92
2010-11-26 · TA获得超过263个赞
知道答主
回答量:535
采纳率:100%
帮助的人:370万
展开全部
刚查了一下MSComm控件的output属性“Output 向传输缓冲区写一个字符串”,应该是该控件只支持字符型数据,如果你要发送数值型数据,那就只能通过str()函数先转换,接收后再通过val()函数转回。如果数据有小数点,要注意这两个函数的参数设置。

“达到以一个字节的长度发送任意一个八位二进制数能表示的数值呢?”,你可以直接把这个八位二进制数作为字符串发送,接收后再根据你需要作相关处理。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
泡泡_申
2016-04-27
知道答主
回答量:14
采纳率:0%
帮助的人:5.6万
展开全部
该数据长度不定,但都是以“0x1B”开头标识,第四五个字节是整个数据的总长度,最后一位是校验,我在接收的时候也能收到,但我用AccessPort查看的时候发现每次收到的不是一个完整的数据帧,而是被拆分成了几个帧,因为是需要高速连续接收的发送的,所以帧被拆分了很不好处理,效率很低,故求达人解答,提供解决方案。附上我的代码
'////////////////////////////////////////////////////////////////////
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.RThreshold = 1 '产生MSComm事件
MSComm1.InBufferSize = 1024
TxtSend = ""
txtReceive = ""

MSComm1.Settings = C2
MSComm1.CommPort = C1
MSComm1.PortOpen = True
'//////////////////////////////////////////////////////////////////////////
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友b400d1b
2015-11-24 · TA获得超过314个赞
知道小有建树答主
回答量:328
采纳率:0%
帮助的人:89.2万
展开全部
你数据不用整理编排的吗?、
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式