串口控件mscomm中的input一次接收多少数据

wang19847277 2008-08-22 10:08:21
大家好:
请问,如果pc机串口接收了40个字节数据,我想从mscomm1.input 中读出,它是一次就接收完呢,还是一个一个字节接收?我怎样知道数据接收完毕呢?
假如用oncomm事件判断,是不是有一个字节接收就要触发事件呢?怎么判断数据接收完毕呢?
...全文
591 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zfxinli 2009-01-12
  • 打赏
  • 举报
回复
我按照你说的方式去弄了一下,发现sum只有一次,我发送12345678显示完全的,但是输入123456789就显示9,这时候sum数是1,让我很费解!?
zdingyun 2008-08-26
  • 打赏
  • 举报
回复
当设置MSComm1.RThreshold = 1
MSCOMM控件的ONCOMM事件为接收缓冲区达到1字节或以上机发生ONCOMM事件
至于ONCOMM事件发生一次能接收多少字节,需依据下位机返回多少字节而定。实验证实
当下位机返回1-8字节,则产生ONCOMM事件1次
每增加1-8字节产生ONCOMM事件1次
你下位机返回40字节则产生ONCOMM事件5次。
你可由下列代码测试:
Option Explicit
Dim sum As Integer
Dim strData As String

Private Sub Command1_Click()
sum = 0
strData = ""
Text1 = ""
Text2 = ""
Text3 = ""
End Sub

Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.RThreshold = 1 '产生MSComm事件
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm() '接收数据
Dim BytReceived() As Byte
Dim strBuff As String
Select Case MSComm1.CommEvent
Case 2
sum = sum + 1
Text2 = sum '显示OnComm事件次数
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
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
Text1 = strData
Text3 = Len(strData) / 2
'数据处理代码
End Select
End Sub
打死不掉牙 2008-08-26
  • 打赏
  • 举报
回复
MSComm1.RThreshold = 40
wang19847277 2008-08-25
  • 打赏
  • 举报
回复
首先,是有通信协议的,发送的数据中包含数据长度
其次,数据是一个字节一个字节送到串口的

现在的问题是数据有丢的情况,所以我想找到一种好的方法接收数据,不丢失数据
Tiger_Zhao 2008-08-22
  • 打赏
  • 举报
回复
接收时,缓冲区中接收到多少字符是时刻变化的。可用下面的方式等待接收固定长度的数据
Function ReciveBytes(ByVal Count As Long) As Variant
While MSComm1.InBufferCount < Count
DoEvents
Wend
MSComm1.InputLen = Count
ReciveBytes = MSComm1.Input
End Function

'调用
vBytes = ReciveBytes(40)
zdingyun 2008-08-22
  • 打赏
  • 举报
回复
脱离上下位机间的串口通信协议和数据约定,讨论此事是无意义的。
打死不掉牙 2008-08-22
  • 打赏
  • 举报
回复
设置:
MSComm1.RThreshold = 1'//当接收到一个字节时产生OnComm事件,设多少可以自己定义
如果你设置为接收一个字节就产生OnComm时间,如果40个字节是连在一起发的,那么当进入OnComm事件时,Input中就会有40个字节.如果不是连续发的,是发几个个字节,间隔一段时间再发,就会产生n个OnComm事件.只有当你读取Input的时候,InputBuffer才会清零,如果不清空,n个OnComm事件之后再读取Input,input读出来的数据还是40个字节.
判断接收完毕好像可以通过InBufferCount大小来判断,如果为零则表明没有数据了.其实读一次Input就会自动清空Buffer,读不出数据时它也就没数据了,呵呵!

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧