本帖最后由 gen331166 于 2012-05-27 16:32:05 编辑

解决方案 »

  1.   

    就几个字节,完全不用使用dowvents
    试试这个:Public Function ComRead(ByVal Order As String) As String
    If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
      MSComm1.Output = Order & Chr(13)
      sleep 50 '如果下位机能立即响应,一般延时50毫秒是足够的
      ComRead =MSComm1.Input  '就几个字节,完全不需要使用循环
      MSComm1.InBufferCount = 0
      MSComm1.OutBufferCount = 0
    End Function
      

  2.   


    用 BusHound 等软件抓一下通讯过程,看看停止时发生了什么?似乎是主机端陷入了等待死循环。疑似传输错误,主机端接收不到回车字符。最好加上超时跳出机制。另外,最好改一下协议:既然最短 3 字节,最长 4 字节,何不全部取齐为 4 字节,3 字节的补一个 Dummy 字符即可。这样会更简单。
      

  3.   

    十分感谢worldy,非常有效。不过这个通讯响应时间较长,最多达到500。用sleep 600时,效果最好。
    看来对485 DI/O模块(我用的是4068/4053/4017)的VB控制,响应时间很关键。
    不同厂商的产品不知道响应时间区别大不大,请高手们发表见解。