首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

太奇怪了!VB中MSCOMM控件的通信自动停止

2013-01-08 
太奇怪了!VB中MSCOMM控件的通讯自动停止本帖最后由 gen331166 于 2012-05-27 16:32:05 编辑VB 6.0 很标准

太奇怪了!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 字符即可。这样会更简单。

热点排行