编写一串行口接收下位机(单片机)数据的程序.现以确定下位机程序无问题,并且利用串口调试精灵接收下位机数据无异常.    但通过VB6.0中的MSCOMM控件接收数据时,出现不能及时响应此事件(MSComm1_OnComm()),导致数据不能实时接收,从而失去实时监控的功能,只有下位机发N次数据之后,上位机才响应此事件(MSComm1_OnComm())MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"Private Sub MSComm1_OnComm()
   Debug.Print MSComm1.Input
end sub

解决方案 »

  1.   

    inputlen=1
    intputmode=..text还需要其它的参数吗?
      

  2.   

    1)串口是否打开。
    2)串口的属性InputMode 是否作正确设置。文本接收设置为comInputModeText,二进制接收设置为comInputModeBinary
    3)使用MSComm1_OnComm需对串口的属性RThreshold初始化为1或需接收的字节长。
      

  3.   

    除以上几点外:
    还需注意MsComm_OnComm事件中需正确选择comEvReceive(接收事件),你不作选择,则串口任何事件都会触发OnComm事件,而导致接收代码受干扰,下面给出按二进制接收的代码
    Private Sub MSComm1_OnComm()
        On Error Resume Next
        Dim BytesReceived() As Byte
        Dim buffer As String
        Dim HData As String
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive               '接收十六进制数据。并以十六进制显示
                MSComm1.InputLen = 0
                MSComm1.InputMode = comInputModeBinary  '设置当前以二进制数接收数据
                buffer = MSComm1.Input                  '接收数据至字符串中
                BytesReceived() = buffer                '将数据转入BYTE中
                For i = 0 To UBound(BytesReceived)      '显示结果以十六进制显示
                    If Len(Hex(BytesReceived(i))) = 1 Then
                        HData = HData & "0" & Hex(BytesReceived(i))
                    Else
                        HData = HData & Hex(BytesReceived(i))
                    End If
                    txtReceive.Text = HData
                    '最后将结果后入txtreceive中
                    MSComm1.OutBufferCount = 0      '清除发送缓冲区
                    MSComm1.InBufferCount = 0       '清除接收缓冲区
                Next
        End Select
    End Sub
      

  4.   

    现在关键是数据在缓冲区内,就是不响应MSComm1_OnComm()此事件呀!!1.当InputLen设为0时,下位机连续几次发送数据,上位机就是不响应此事件MSComm1_OnComm(),如果下位机要发5次左右(无规则的),才响应一次MSComm1_OnComm()
     则所收到的数据,就会包含那五次没有响应的数据,一次接收回来。2.当InputLen 设为1时,下位机连续几次发送数据,上位机同样不响应其事件,如果发5次数据才响应此事件的话,那么,这5次的数据只为第一次发送的数据
      

  5.   

    是否设置RThreshold = 1,估计你设置RThreshold = 5,造成此情况。
      

  6.   

    呵呵,真是这个问题,谢谢
    RThreshold = 1就OK了