与PC机相连的是一台通信设备,用超级终端能收发,现在就是用VB做一个界面,取代超级终端。开始,PC机要不断的询问"READY?",如果收到"I am ready",则表示设备准备就绪。我的程序如下:
(省略串口初始化部分)
     MSComm1.Output = "READY?" & Chr$(13)
     Do
      DoEvents
      MSComm1.Output = "READY?" & Chr$(13)'不断的发送询问信息
      Buffer$ = Buffer$ & MSComm1.Input
     Loop Until Right(Buffer$, 1) = Chr$(13)'收到的信息以回车结束(规定好了的)    从发出询问,至收到信息跳出循环,大概需要10秒,当然这是不正确的,在超级终端上试,马上就有返回信息,请问我的程序循环用得不对吗?应该怎么改?

解决方案 »

  1.   

    你在 Buffer$ = Buffer $ & MSComm1.Input 后面debug.print Buffer 看看 
    是不是有这中可能? MSComm1.Input取出来的可能正在发送“I AM READY”13 中途,
    下次又错过了回车, 试着改成 if instr(1,buffer,chr$(13)) 看看
    还有,从程序设计角度来说:不应该把接收放在这里,而应该在ONCOMM事件中。这样,你可以知道
    是不是缓冲区满了,是否接收到数据,产生了错误信息等而相应处理。当然你看看闸门的设置是不是太大了,缓冲区的大小怎么样。对你这个程序来说mscomm1.RThreshold <>1 也有可能产生上述原因.想想为什么?
      

  2.   

    '这样组织结构
    Private Sub Command1_Click()
        Dim MyData As Variant
        Dim strData As String
        Dim i As Integer
        
    begin:
         i = i + 1
        MSComm1.Output = "READY?" & Chr$(13)
        
        MSComm1.InBufferCount = 0   '清空接收缓冲区
        Do
          DoEvents
        Loop Until MSComm1.OutBufferCount = 0    '
         
        sngTime = Timer
        Do
          DoEvents
          If Abs(Timer - sngTime) > 100 Then GetData = False: Exit Function  '等待100ms
        Loop Until MSComm1.InBufferCount = Len("I am ready")  '如果有回车再+1
        
        MyData = MSComm1.Input
        strData = MyData
        
        If i > 10 Then Exit Sub
        
        If MyData <> "I am ready" Then
           GoTo begin
        Else
           MsgBox "ok"
        Next i
            
        
    End Sub