太奇怪了!VB中MSCOMM控件的通讯自动停止
本帖最后由 gen331166 于 2012-05-27 16:32:05 编辑 VB 6.0
很标准的一段通讯程序,用来给485模块通讯,每2秒与模块发出一次通信,每次发送与接受字长约3-4个字节:
Public Function ComRead(ByVal Order As String) As String
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
MSComm1.Output = Order & Chr(13)
Do
DoEvents
ComRead = ComRead & MSComm1.Input
Loop Until InStr(ComRead, vbCr)
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
End Function
每次建立通讯后,一切正常,但2~3分钟后该com口会自行停止,此时最奇怪的是假如再打开该com口,系统反馈“只有当端口关闭时,操作有效”;假如关闭该com口,系统反馈“只有当端口打开时,操作有效”。此时程序似乎处于端口塞车的状态。求各位大侠指点!
MSCOMM1的主要属性值:
settings: 9600,n,8,1
Inputlen: 10
RThreshold: 1
SThreshold: 0
[解决办法]
就几个字节,完全不用使用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
[解决办法]
用 BusHound 等软件抓一下通讯过程,看看停止时发生了什么?
似乎是主机端陷入了等待死循环。疑似传输错误,主机端接收不到回车字符。
最好加上超时跳出机制。另外,最好改一下协议:既然最短 3 字节,最长 4 字节,何不全部取齐为 4 字节,3 字节的补一个 Dummy 字符即可。这样会更简单。