就几个字节,完全不用使用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
试试这个: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
用 BusHound 等软件抓一下通讯过程,看看停止时发生了什么?似乎是主机端陷入了等待死循环。疑似传输错误,主机端接收不到回车字符。最好加上超时跳出机制。另外,最好改一下协议:既然最短 3 字节,最长 4 字节,何不全部取齐为 4 字节,3 字节的补一个 Dummy 字符即可。这样会更简单。
看来对485 DI/O模块(我用的是4068/4053/4017)的VB控制,响应时间很关键。
不同厂商的产品不知道响应时间区别大不大,请高手们发表见解。