强制关闭COM端口

15
我正在开发一个使用COM端口与外部控制器通信的应用程序。当我连接了通信电缆并重新启动PC时,Windows(7)会自动打开这个端口,即使没有任何应用程序运行,所以我就无法再次访问它。我试图通过编程的方式关闭它,但是它一直被占用着。有人有办法强制关闭它吗?有没有什么程序可以在我的应用程序之前运行,或者有没有一种无论如何都能编程地关闭它的方法?

对我来说听起来像是有另一个应用程序,甚至是你的应用程序在启动时打开端口,而不管连接/断开电缆。在98、XP、Vista或7上从未遇到过这样的问题。你是说如果在重新启动时断开电缆,你能够控制端口吗? - Andy
确切地说,如果电缆未连接或控制器关闭,我就可以访问该端口。我不认为这是我的应用程序的问题,因为我在退出应用程序时关闭了端口,而且只有在重新启动机器时才会发生这种情况。 - Clone
我也尝试过在启动时不运行我的应用程序,甚至在重新启动之前根本不运行它。 - Clone
5个回答

19

虽然我无法关闭端口,但经过大量搜索和测试,我找到了问题的根源。我发表此解决方案是为了帮助遇到同样问题的人。

Windows将与串行端口连接的恒定数据流设备识别为串行鼠标(在该系统中为Microsoft Serial Ballpoint),并尝试安装它们,接管控制端口而不使用任何进程。解决方法是等待Windows安装该设备(在“鼠标和其他指针设备”下检查设备管理器),然后禁用它。如果卸载该设备,它将被重新安装,问题将重现。

感谢每个试图提供帮助的人,我希望其他人也能从这个解决方案中受益。


1
这是我工作中持续存在的一个问题。我们所有的专有设备都使用某种形式的COM端口进行连接。很多设备在通电时会自动从它们的数据端口中喷出数据,如果你在其中一个设备连接的情况下重新启动计算机,Windows会将其检测为Intel Ballpoint鼠标并拒绝放弃该端口。我们发现可以强制该端口禁用枚举以防止在启动时安装鼠标,但我们没有一个通用的解决方案,它被分别应用于我们的各种机器上,这并不理想。 - delliottg
这正是困扰我一段时间的问题。将天平连接到真实的COM端口,每隔一段时间尝试启动程序时都会出现访问被拒绝的情况。Process Explorer没有显示任何使用该端口的内容,但是一旦我发现了这个问题,我进入设备管理器并在COM1上看到Ballpoint鼠标“正常工作”。WTF?!?!感谢您发现了这个问题! - topshot

10

不能强制关闭端口(请参见此问题)。没有办法强制其他进程关闭端口,以便您可以使用它。

但是,Windows本身并没有打开该端口-可能是后台运行的某个其他应用程序在打开它。下载Process Explorer并使用“查找”菜单上的“查找句柄或DLL”来查找打开COM端口的进程。如果它是机器上的物理COM端口,则名称将为Serial0、Serial1、...或SerialN,其中COM1映射到Serial0。如果这是USB转COM适配器,则不确定设备ID是什么。

您也可以尝试使用PortMon来监视端口上的活动。PortMon将显示具有打开端口的进程。


我会尝试使用"Process Explorer"来查看是什么占据了该端口。感谢您的提示。 - Clone
3
一个快速的更新,因为我仍在处理同样的事情:这个端口没有任何进程或句柄连接,但它仍然保留。 - Clone

2

我的解决方法是关闭持续输出的设备,拔出 USB,再次插入以让 Windows 检测 COM 号码,然后再打开设备。


1

我猜测当您关闭应用程序并重新启动计算机时,外部控制器没有优雅地关闭其一侧的事物,并处于未定义状态。

当计算机重新启动时,控制器仍处于此非法状态,看起来您无法在计算机上打开端口,因为通信无法正确重新建立。

也许外部控制器没有正确处理DTR / DSR线的状态变化?

PC和控制器之间的电缆如何连接?

如果不知道任何具体信息,很难说更多。


1
可能是这样的,控制器使用 RTS/DTR 线路,我认为这可能是导致 Windows “看到”端口处于活动状态的原因。这是我第一次尝试从程序中修复它,下一步将是将控制器发送到待机状态,直到它检测到 PC 处于“唤醒”状态。 - Clone

0
我所做的是禁用控制器,关闭它,重新启动我的计算机,开机(在Windows加载后)并返回启用它。对于我遇到的两个出现此问题的微控制器,这种方法都有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接