大家好:
    请问,如果pc机串口接收了40个字节数据,我想从mscomm1.input 中读出,它是一次就接收完呢,还是一个一个字节接收?我怎样知道数据接收完毕呢?
    假如用oncomm事件判断,是不是有一个字节接收就要触发事件呢?怎么判断数据接收完毕呢?

解决方案 »

  1.   

    设置: 
    MSComm1.RThreshold = 1'//当接收到一个字节时产生OnComm事件,设多少可以自己定义
    如果你设置为接收一个字节就产生OnComm时间,如果40个字节是连在一起发的,那么当进入OnComm事件时,Input中就会有40个字节.如果不是连续发的,是发几个个字节,间隔一段时间再发,就会产生n个OnComm事件.只有当你读取Input的时候,InputBuffer才会清零,如果不清空,n个OnComm事件之后再读取Input,input读出来的数据还是40个字节.
    判断接收完毕好像可以通过InBufferCount大小来判断,如果为零则表明没有数据了.其实读一次Input就会自动清空Buffer,读不出数据时它也就没数据了,呵呵!
      

  2.   

    接收时,缓冲区中接收到多少字符是时刻变化的。可用下面的方式等待接收固定长度的数据
    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)
      

  3.   

    当设置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 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
      

  4.   

    我按照你说的方式去弄了一下,发现sum只有一次,我发送12345678显示完全的,但是输入123456789就显示9,这时候sum数是1,让我很费解!?