可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。
如果你的返回值字节数(InBuffCount)>2的话,你读两个字节再接收,可能会出错。而且串口传送数据很快,如果设断点的话,数据容易丢失。
可以这样
dim V1 as Variant
do 
   If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
    doevents
    if mscomm1.inbuffcount=2 then
        v1=mscomm1.inbuff
        buff=buff&v1
    else
        If MSComm1.PortOpen Then MSComm1.PortOpen = false
    end if
until do

解决方案 »

  1.   

    Public Sub ComOpen()'初始化部分
        On Error GoTo Skip
        With FrmInterFace.MSC
            If .PortOpen = True Then .PortOpen = False
            .CommPort = CommNumber'设置使用的段口号
            .InBufferSize = 1024'设置缓冲区
            .OutBufferSize = 1024
            .InputMode = comInputModeBinary
            .InputLen = 1
            If .PortOpen = False Then .PortOpen = True
        End With
        Exit Sub
    Skip:
      SetOnTop FrmChuShiHua.hwnd, False
        MsgBox "端口设置错误", vbCritical, "错误"
    End Sub
    '波特率在控件里直接设的Private Sub TimJieShou_Timer()'定时器定时查询接收
    Dim Temp
    Static Msg(1024) As Byte
    Static MsgLen As Integer
    Dim tMsg() As ByteDim I, Test As Integer
    Dim J As Integer
    Static MsgStr As String
    Dim IntTimeOut
    TimJieShou.Enabled = False    With MSC
        If .InBufferCount = 0 Then GoTo Skip        TimLinkOk.Enabled = False
            TimLinkOk.Interval = 0
            FrmMain.LabStatus.BackColor = vbGreen
            FrmMain.LabStatus.Caption = "连接正常"
            Do While .InBufferCount <> 0
                Temp = .Input
                On Error GoTo Skip
                Select Case Temp(0)
                Case 255
                    Erase Msg
                    MsgLen = 0
                    MsgStr = ""
    '                Msg(MsgLen) = Temp(0)
    '                MsgLen = MsgLen + 1
                Case 254
    '                Msg(MsgLen) = Temp(0)
    '                MsgLen = MsgLen + 1
                    If MsgLen > 1 Then
                        ReDim tMsg(MsgLen - 1) As Byte
                        For J = 0 To MsgLen - 1
                            tMsg(J) = Msg(J)
                        Next J
                        MsgHandle tMsg  '调用消息处理函数
                    End If
                    
                    MsgLen = 0
                    Erase Msg
                    
                    With Form1.List1
                      .AddItem "<--- " & MsgStr, 0
                      If .ListCount > 100 Then .RemoveItem 100
                    End With
                    
                    MsgStr = ""
                Case Else
                    Msg(MsgLen) = Temp(0)
                    If Msg(MsgLen) <= 15 Then MsgStr = MsgStr & "0"
                    MsgStr = MsgStr & Hex(Msg(MsgLen)) & " "
                    MsgLen = MsgLen + 1
                End Select
            Loop
        End With
    '    NetInit
    Skip:
        TimJieShou.Enabled = True
        If FrmMain.LabStatus.Caption = "连接中断" Then Exit Sub
        TimLinkOk.Enabled = True
        TimLinkOk.Interval = 2000
    End Sub
    '这个是我用串口的一段代码,希望对你有帮助
      

  2.   

    设置inputlength=10然后用InBufferCount 属性
          返回接收缓冲区中等待的字符数。该属性在设计时无效。语法object.InBufferCount[ = value ]InBufferCount 属性的语法包括下列部分:部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    value 整型表达式,说明在接收缓冲区中等待的字符数。 
    说明InBufferCount 是指调制解调器已接收,并在接收缓冲区等待被取走的字符数。可以把 InBufferCount 属性设置为 0 来清除接收缓冲区。注意   不要把该属性与 InBufferSize 属性混淆。InBufferSize 属性返回整个接收缓冲区的大小。数据类型Integer
      

  3.   

    好像答过这个问题
    注意CommEvent这东西
    oncomm事件不光是由输入触发的