我正在开发一个使用COM端口与外部控制器通信的应用程序。当我通过连接通信电缆重新启动PC时,Windows(7)打开端口,没有任何应用程序运行,因此我无法再访问它。我试图以编程方式关闭它,但它只是保持不变。
任何人都知道如何强制关闭它,我可以在我的应用程序之前运行的任何程序,或者以编程方式关闭它的方式,无论如何?
答案 0 :(得分:14)
我没有设法关闭端口,但经过大量的搜索和测试后,我发现了问题的根源。我正在发布解决方案,以帮助任何有同样问题的人。
Windows将具有连接到串行端口的常量数据流的设备识别为串行鼠标(在此系统中为Microsoft Serial Ballpoint),并尝试安装它们,接管对端口的控制,而无需使用任何进程。解决方案是等待Windows安装设备(检查Mouses和其他指针设备下的设备管理器),然后禁用它。如果卸载设备,它将再次安装,问题又回来了。
感谢所有试图提供帮助的人,我希望其他人会觉得这个解决方案很有用。
答案 1 :(得分:10)
没有办法强迫端口关闭(请参阅此question)。没有办法强制另一个进程关闭端口,所以你可以接受它。
但Windows本身并没有打开端口 - 在后台运行的其他一些应用程序可能正在这样做。下载Process Explorer并使用“查找”菜单上的“查找句柄或DLL”查找打开COM端口的过程。如果它是机器上的物理COM端口,它将被命名为Serial0,Serial1,...或SerialN,其中COM1映射到Serial0。如果它是USB转COM适配器,我不确定设备ID是什么。
您还可以尝试使用PortMon来监听端口上的活动。 PortMon将向您显示端口打开的进程。
答案 2 :(得分:2)
我如何通过连续输出关闭设备,拔掉usb,再次插入以让windows检测到com号,然后再打开设备。
答案 3 :(得分:1)
我的猜测是,当您关闭应用程序并重新启动PC时,外部控制器并没有优雅地关闭它,并且处于未定义状态。
当PC重新启动时,控制器仍然处于非法状态,并且外观无法打开PC上的端口,因为无法正常重新建立通信。
也许外部控制器没有正确处理DTR / DSR线路状态的变化?
PC和控制器之间的电缆是如何连线的?
在不知道任何细节的情况下很难说更多。
答案 4 :(得分:0)
这样的东西?
if (serialPort.IsOpen) serialPort.Close();
答案 5 :(得分:0)
我所做的是禁用控制器,关闭它,重新启动计算机,打开它(一旦窗口加载)然后返回启用它。这对我来说有两个微控制器有这个问题。