大家好:
请问,如果pc机串口接收了40个字节数据,我想从mscomm1.input 中读出,它是一次就接收完呢,还是一个一个字节接收?我怎样知道数据接收完毕呢?
假如用oncomm事件判断,是不是有一个字节接收就要触发事件呢?怎么判断数据接收完毕呢?
请问,如果pc机串口接收了40个字节数据,我想从mscomm1.input 中读出,它是一次就接收完呢,还是一个一个字节接收?我怎样知道数据接收完毕呢?
假如用oncomm事件判断,是不是有一个字节接收就要触发事件呢?怎么判断数据接收完毕呢?
MSComm1.RThreshold = 1'//当接收到一个字节时产生OnComm事件,设多少可以自己定义
如果你设置为接收一个字节就产生OnComm时间,如果40个字节是连在一起发的,那么当进入OnComm事件时,Input中就会有40个字节.如果不是连续发的,是发几个个字节,间隔一段时间再发,就会产生n个OnComm事件.只有当你读取Input的时候,InputBuffer才会清零,如果不清空,n个OnComm事件之后再读取Input,input读出来的数据还是40个字节.
判断接收完毕好像可以通过InBufferCount大小来判断,如果为零则表明没有数据了.其实读一次Input就会自动清空Buffer,读不出数据时它也就没数据了,呵呵!
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)
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 StringPrivate Sub Command1_Click()
sum = 0
strData = ""
Text1 = ""
Text2 = ""
Text3 = ""
End SubPrivate 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 SubPrivate 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