我要接收有头和尾的数据,头是35 尾是“H0D”,为什么我把sleep去了就不可以了
    MSComm1.InputMode = comInputModeBinary      '采用二进制接收
    MSComm1.InBufferCount = 0  '清空接受缓冲区
    MSComm1.OutBufferCount = 0  '清空传输缓冲区
    MSComm1.InBufferSize = 100 '接收缓冲区大小
    MSComm1.OutBufferSize = 100 '发送缓冲区大小
    MSComm1.RThreshold = 1      '设置引发OnComm事件的字节长度
    MSComm1.InputLen = 1 '设置Input从接收缓冲读取全部数据
    MSComm1.PortOpen = True
Private Sub MSComm1_OnComm()
     Sleep (500)
     Select Case MSComm1.CommEvent
      Case comEvReceive 
        Do While MSComm1.InBufferCount <> 0
            indata = MSComm1.Input
            If jieshouok Then
               arrt(p) = indata(0)
               p = p + 1
            Else
                If jieshouok = False And indata(0) <> 35 Then
                Else
                  jieshouok = True
                  arrt(p) = indata(0)
                  p = p + 1
                End If
            End If
            If indata(0) = 13 And jieshouok Then
                '获得数据后开始处理
            end if
        Loop
     End Select
end sub

解决方案 »

  1.   

    使用OnComm事件接收无须Sleep
    另请LZ完整叙述通信协议和数据帧构成.
      

  2.   

    数据构成:# 数据 CRC “0D”,没有sleep,有些数据好像收不到
      

  3.   

    zdingyun,你好,能不能给个QQ,好及时求助
      

  4.   

    先给个2进制接收方式的代码参考:
    Option Explicit
        Dim strRecHex As StringPrivate Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.InBufferSize = 1024
        MSComm1.OutBufferSize = 512
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.InputMode = comInputModeBinary '二进制接收
        MSComm1.InputLen = 0 
        MSComm1.PortOpen = True
        MSComm1.RThreshold = 1 
    End SubPrivate Sub MSComm1_OnComm()
        Dim ReceiveFrame() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
                ReDim ReceiveFrame(MSComm1.InBufferCount)
                Debug.Print MSComm1.InBufferCount
                ReceiveFrame() = MSComm1.Input 'Input属性:返回并删除接收缓冲区中的数据流
                 For i = 0 To UBound(ReceiveFrame)
                    strRecHex = strRecHex & Right("0" & Hex(ReceiveFrame(i)), 2)
                Next
                If Mid(strRecHex, 1, 2) = "23" And Right(strRecHex, 4) = "0D" Then
                    Text1 = strRecHex
                    '写数据处理代码
                    strRecHex = ""
                End If
        End Select
    End Sub
      

  5.   

    更正:
    Private Sub MSComm1_OnComm()
        Dim ReceiveFrame() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
                ReDim ReceiveFrame(MSComm1.InBufferCount)
                Debug.Print MSComm1.InBufferCount
                ReceiveFrame() = MSComm1.Input 'Input属性:返回并删除接收缓冲区中的数据流
                 For i = 0 To UBound(ReceiveFrame)
                    strRecHex = strRecHex & Right("0" & Hex(ReceiveFrame(i)), 2)
                Next
                If Mid(strRecHex, 1, 2) = "23" And Right(strRecHex, 2) = "0D" Then
                    Text1 = strRecHex
                    '写数据处理代码
                    strRecHex = ""
                End If
        End Select
    End Sub
      

  6.   

    Sleep用在此处是为了延迟片刻,为的是让你的下位机数据完全的传送到串口缓冲区,如果你把它去除,那么很有可能(一般是肯定)下位机数据没有全部上传上来。我试着修改了一下你的代码,切勿见笑:)
    Option Explicit
    Private Sub Form_Load()
        MSComm1.InputMode = comInputModeBinary      '采用二进制接收
        MSComm1.InBufferCount = 0                   '清空接受缓冲区
        MSComm1.OutBufferCount = 0                  '清空传输缓冲区
        MSComm1.InBufferSize = 100                  '接收缓冲区大小
        MSComm1.OutBufferSize = 100                 '发送缓冲区大小
        MSComm1.RThreshold = 1                      '设置引发OnComm事件的字节长度
        MSComm1.InputLen = 1                        '设置Input从接收缓冲读取全部数据
        MSComm1.PortOpen = True
    End SubPrivate Sub MSComm1_OnComm()
        Dim inData() As Byte
        Select Case MSComm1.CommEvent
          Case comEvReceive
            MSComm1.RThreshold = 0
            Sleep (500)
            inData = MSComm1.Input
            If inData(0) = 13 And inData(UBound(inData)) = &H35 Then
                '获得数据后开始处理
                
            End If
            MSComm1.RThreshold = 1
        End Select
    End Sub
     
      

  7.   

    补充一点:把MSComm1.InputLen = 1修改为:MSComm1.InputLen = 0
    由于我不清楚你的下位机上传数据的方式,可能这个程序会有点问题,很希望和你讨论:)
      

  8.   

    10楼你好,如果缓冲区里面是两串数据怎么办,也就是出现#hhhhhhh(结束)#jjjjjjj(结束),要求是如果出现这样的两串,则读取第一串,处理,再读第二串处理
      

  9.   

    既然 你设定 MSComm1.RThreshold = 1 和 MSComm1.InputLen = 1 ,那么应该用定时器的,不要用sleep。
    ===============================================================并且Sleep (500) 
     时间太长了。你改短点试试。这个MSCOMM控件 肯定不是省油的灯!!!  问题一堆!!! 控件本身问题太多!!
      

  10.   


    这个世界上使用MSCOMM控件实现串口通信不知道有多少了.现在就看到LS对MSCOMM控件意见很大!
      

  11.   

     MSComm1.InputLen = 1 '设置Input从接收缓冲读取全部数据 此句有误啊inputlen函数是“设置并返回 Input 属性从接收缓冲区读取的字符数”。设置成1的话就是每一次从接收缓冲区读取1个字符吧
      

  12.   

    我还有个问题请教下大家
    在这里.InputMode = comInputModeBinary采用二进制接收,和.InputMode =comInputModeText采用文本接受有什么区别啊?
      

  13.   

    回楼上,22,楼说的“设置成1的话就是每一次从接收缓冲区读取1个字符吧”是对的。楼主就是想一次取一个字符啊  23楼:如果含控制字符,就用二进制。找MSDN看看我下面有个网址 你找找
      

  14.   

    http://hi.baidu.com/voa2007/blog/item/4cfc37ecd9928bd52e2e2109.html
      

  15.   

    对于有起始字符和结束字符的通讯来说,设置    MSComm1.RThreshold = 1      '设置引发OnComm事件的字节长度 
        MSComm1.InputLen = 1        '设置Input从接收缓冲读取 1 字节是常见的方法。不过你设置缓冲区为 100 似乎太小,容易溢出。缺省设置是 1024。Private Sub MSComm1_OnComm() 
        Select Case MSComm1.CommEvent 
          Case comEvReceive 
            Do While MSComm1.InBufferCount > 0 
                indata = MSComm1.Input 
                If jieshouok Then
                    If indata(0) = 13 Then 
                        jieshouok = Flase
                        p = 0
                        '获得数据后开始处理 
                      Else
                        arrt(p) = indata(0) 
                        p = p + 1
                    End If 
                Else 
                    If indata(0) = 35 Then 
                        jieshouok = True 
                    End If 
                End If 
            Loop 
        End Select 
    end sub