VB拔掉已经打开的串口问题

忽如远行客 2013-08-30 01:56:54
VB软件打开了某个串口后正在运行,怎么实现当串口线拔掉后该打开的串口也跟着关闭。不然再插回串口线后继续发送数据的时候就会卡机,软件就会没响应了,只能重现打开软件才可以。
...全文
1260 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
肚皮向上的鱼 2013-12-25
  • 打赏
  • 举报
回复
请问楼主你解决了吗?我现在也遇到这个问题,串口本来在正常工作,现在假设突然拔出串口,本来想通过注册表中的COM口列表来判断,可是拔出后那个口还存在,只有关掉程序才会消失。所以现在不知道怎么处理,拔掉的话这个COM口居然一直是打开着的,还不能关掉它(会提示这个COM口不存在),真是郁闷啊
startbin 2013-10-09
  • 打赏
  • 举报
回复
有2个解决方案 1,是监视WM_DEVICECHANGE消息 然后枚举硬件设备看看你的虚拟usb串口是否还在 2,是每次需要用的时候才打开串口发消息 发完后关闭串口
of123 2013-10-08
  • 打赏
  • 举报
回复
你需要清理的是,对串口设备操作的层面问题。 1 所谓打开和关闭串口,实际上是对 PC 端控件的操作。只要本机该端口存在且没有打开,就可以无错误地打开串口。 2 当 PC 端发送数据时,本机硬件会改变接口上 TXD 脚的电平。无论是否真有线路连接,都不会出错。 3 当 PC 端接收数据时,如果你的代码是定长循环的,且线路断开或外部设备没有正确回应,则会停留在循环中。 因此,你的解决之道至少有两种: 1 在你的循环中加入超时处理(可以借助 Timer)。 2 如果你的架构是通过中断方式接收(而不是发送代码中的死循环接收),且通过设置公共变量标志来确定成功接收到最后发送的数据的应答。则可以在发送持续中,显示一个 Reset 按钮。如果长时间没有得到应答,按此按钮,将公共变量恢复为允许发送的状态。
drowsihead 2013-10-08
  • 打赏
  • 举报
回复

Public Class 通讯
Friend m串口 As New System.IO.Ports.SerialPort


Public Property 连接() As Boolean
 Get
    Return m串口.IsOpen
 Set(ByVal value As Boolean)
If value Then
 If m串口.IsOpen = False Then
    Try
      m串口.Open()
    Catch ex As Exception
                               
    End Try
  End If
  Else
     m串口.Close()
End If
End Class
zaxife 2013-10-05
  • 打赏
  • 举报
回复
引用 41 楼 drowsihead 的回复:
[quote=引用 40 楼 drowsihead 的回复:] 这里真热闹啊。 我觉得可以这样: 每次通讯时构造串口,用完关掉。出错也关掉。 这样,只要系统有串口就会通讯。
我们现在的通讯就是这样实现的,设备关闭,打开均可以实现通讯,不关闭软件绝对没问题。[/quote] 嗯,API里面是这样搞很安逸。
drowsihead 2013-09-30
  • 打赏
  • 举报
回复
引用 40 楼 drowsihead 的回复:
这里真热闹啊。 我觉得可以这样: 每次通讯时构造串口,用完关掉。出错也关掉。 这样,只要系统有串口就会通讯。
我们现在的通讯就是这样实现的,设备关闭,打开均可以实现通讯,不关闭软件绝对没问题。
忽如远行客 2013-09-30
  • 打赏
  • 举报
回复
引用 41 楼 drowsihead 的回复:
[quote=引用 40 楼 drowsihead 的回复:] 这里真热闹啊。 我觉得可以这样: 每次通讯时构造串口,用完关掉。出错也关掉。 这样,只要系统有串口就会通讯。
我们现在的通讯就是这样实现的,设备关闭,打开均可以实现通讯,不关闭软件绝对没问题。[/quote] 您是怎么实现的?
drowsihead 2013-09-18
  • 打赏
  • 举报
回复
这里真热闹啊。 我觉得可以这样: 每次通讯时构造串口,用完关掉。出错也关掉。 这样,只要系统有串口就会通讯。
of123 2013-09-12
  • 打赏
  • 举报
回复
串口不是即插即用设备,你这样的需求就有点离谱。按理说,串口线是不允许热插拔的。 即使是 U 转串,也必须是拔掉 U 口端才能用系统消息来感知(USB 是即插即用)。 所以,你的需求可能要在主机和设备端建立应答机制。主机向设备发送查询命令,设备返回一个状态。主机端可以利用 Timer 定时查询。因为串口的超时需要很久,可以用 Timer 在发出查询命令后计时处理。这样的方式可以适合各种串口。
msdtx 2013-09-09
  • 打赏
  • 举报
回复
不接收就检测 OutBufferCount .实在搞不定再联系我。
忽如远行客 2013-09-09
  • 打赏
  • 举报
回复
引用 33 楼 of123 的回复:
用 U 转串倒好办了。只要监控 OnDeviceChange 消息。
那这个虚拟串口的该怎么弄呢。。我卡这儿好多天了,一直没解决
忽如远行客 2013-09-09
  • 打赏
  • 举报
回复
引用 32 楼 msdtx 的回复:
[quote=引用 24 楼 zdingyun 的回复:] 串口打开的时候进行拔插会出现了8021错误 If Err.Number = 8021 Then MsgBox "端口检索设备错误!", vbOKOnly + vbExclamation, "提示" MSComm1.PortOpen = False exit sub end if 详细参阅:http://bbs.csdn.net/topics/360133044
我用这个8021 错误成功的检测并处理拔USB 头的问题,是在检测InbufCount 时产生异常的。你接收数据的代码可能有问题。[/quote] 啊,那能共享一下您的这段接收代码吗,我学习一下
of123 2013-09-09
  • 打赏
  • 举报
回复
用 U 转串倒好办了。只要监控 OnDeviceChange 消息。
忽如远行客 2013-09-09
  • 打赏
  • 举报
回复
引用 36 楼 msdtx 的回复:
[quote=引用 34 楼 rtgchym 的回复:] [quote=引用 32 楼 msdtx 的回复:] [quote=引用 24 楼 zdingyun 的回复:] 串口打开的时候进行拔插会出现了8021错误 If Err.Number = 8021 Then MsgBox "端口检索设备错误!", vbOKOnly + vbExclamation, "提示" MSComm1.PortOpen = False exit sub end if 详细参阅:http://bbs.csdn.net/topics/360133044
我用这个8021 错误成功的检测并处理拔USB 头的问题,是在检测InbufCount 时产生异常的。你接收数据的代码可能有问题。[/quote] 啊,那能共享一下您的这段接收代码吗,我学习一下[/quote] 原始代码混在工程逻辑里,更显得麻烦。你付费我可以代你做。[/quote] 啊。代做倒不用了。。您要能解决这个问题就感激不尽了。。现在我的程序还没有任何接收数据,就是我只负责在按键按下的时候发送数据,平时什么都不做,不需要接收数据的,所以您说的接收代码可能有问题有待商榷
msdtx 2013-09-09
  • 打赏
  • 举报
回复
引用 34 楼 rtgchym 的回复:
[quote=引用 32 楼 msdtx 的回复:] [quote=引用 24 楼 zdingyun 的回复:] 串口打开的时候进行拔插会出现了8021错误 If Err.Number = 8021 Then MsgBox "端口检索设备错误!", vbOKOnly + vbExclamation, "提示" MSComm1.PortOpen = False exit sub end if 详细参阅:http://bbs.csdn.net/topics/360133044
我用这个8021 错误成功的检测并处理拔USB 头的问题,是在检测InbufCount 时产生异常的。你接收数据的代码可能有问题。[/quote] 啊,那能共享一下您的这段接收代码吗,我学习一下[/quote] 原始代码混在工程逻辑里,更显得麻烦。你付费我可以代你做。
msdtx 2013-09-08
  • 打赏
  • 举报
回复
引用 24 楼 zdingyun 的回复:
串口打开的时候进行拔插会出现了8021错误 If Err.Number = 8021 Then MsgBox "端口检索设备错误!", vbOKOnly + vbExclamation, "提示" MSComm1.PortOpen = False exit sub end if 详细参阅:http://bbs.csdn.net/topics/360133044
我用这个8021 错误成功的检测并处理拔USB 头的问题,是在检测InbufCount 时产生异常的。你接收数据的代码可能有问题。
忽如远行客 2013-09-08
  • 打赏
  • 举报
回复
这帖子是要沉吗。。求各路大神指教啊。。。
忽如远行客 2013-09-01
  • 打赏
  • 举报
回复
引用 28 楼 bakw 的回复:
[quote=引用 19 楼 rtgchym 的回复:]
[quote=引用 18 楼 bakw 的回复:]
怪了,我可以的,Arduino 试过我才发的

我这边亲测真不行的。。我的串口是用STM32的USB虚拟的,拔掉后我再发送数据上位机会很卡,执行再打开串口代码错误号也还是8005[/quote]
你拔掉的是串口线,不是USB线是吧?[/quote]
我把掉的是USB线。。不是串口。。因为我说我的串口是用USB虚拟出来的,也不是USB转串口,就是这里的串口9,我插上USB后,设备里会出现这个虚拟串口,拔掉USB后串口消失
忽如远行客 2013-09-01
  • 打赏
  • 举报
回复
引用 27 楼 yachong 的回复:
楼主用的什么线? 是纯粹的USB线虚拟的串口还是用的USB转串口线? 我用力特的USB转串口线试了一下,监视一下注册表HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM绝对是可行的。
我用的是USB虚拟的串口,不是转的。。我虚拟的串口拔掉USB后只有关掉串口注册表才会显示没有,不然刷新后还在的。
笨狗先飞 2013-09-01
  • 打赏
  • 举报
回复
引用 19 楼 rtgchym 的回复:
[quote=引用 18 楼 bakw 的回复:] 怪了,我可以的,Arduino 试过我才发的
我这边亲测真不行的。。我的串口是用STM32的USB虚拟的,拔掉后我再发送数据上位机会很卡,执行再打开串口代码错误号也还是8005[/quote] 你拔掉的是串口线,不是USB线是吧?
加载更多回复(27)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧