如果未使用CloseHandle正确关闭,则重新打开串行端口失败

问题描述 投票:2回答:6

我正在使用Windows上的USB设备,该设备被视为虚拟串行端口。我可以使用CreateFile和ReadFile函数与设备通信,但是在某些情况下,我的应用程序不调用CloseHandle(当我的应用程序在开发中崩溃时)。之后,所有对CreateFile的调用均失败(ERROR_ACCESS_DENIED),唯一的解决方法是再次登录到我的计算机。有什么方法可以以编程方式强制关闭打开手柄(或重新打开)?

c++ windows serial-port createfile
6个回答
2
投票

这当然是不正常的。进程终止后,Windows自动关闭所有保持打开状态的句柄。尽管很难弄清楚它如何弄乱了USB设备驱动程序,但这肯定是一个缺陷。然而,众所周知,那些模拟串行端口的端口却很糟糕。嗯,您无能为力,只是希望制造商提供驱动程序更新。或其他制造商的设备。


2
投票

我同意之前的两篇文章。

  1. 这不是正常情况。
  2. 通常拔出USB设备会有所帮助。

此问题与FTDI驱动程序中的故障有关,该故障负责实现虚拟COM端口。另一方面,这些“故障”与USB设备的各种故障有关。 (当然,这不能证明FTDI驱动程序是合理的。)>

顺便说一句,某些FTDI驱动程序还有其他一些已知问题:

  • 有时调用CloseHandle只是挂起了调用线程。
  • 有时,即使关闭了应用程序,它在任务管理器中仍然是“可见的”。任务管理器无法终止应用程序,并且调试器也不能附加到该应用程序。其EXE文件被锁定(无法删除)。
  • 通常情况下,立即拔下USB设备会有所帮助。 FTDI驱动程序似乎正在“等待某事”。


1
投票

崩溃的程序的某些线程或子进程是否仍在运行并持有文件句柄的副本?也许调试器进程仍然打开?如果是这样,那可能会使设备保持打开状态。我会检查任务管理器以确保;如果是这样,强行杀死剩余的进程可能会解决此问题。


0
投票

您不想发生的另一件事是拥有一个开放的USB串行端口,并且用户将USB拉到串行适配器。该错误已经存在很长时间了。这是该错误的答案


0
投票

也许您可以在主代码周围添加一个Try catch关闭,然后在catch关闭中调用CloseHandle。然后,即使程序崩溃,也会调用CloseHandle。


-1
投票

尝试拔出设备并重新插入。有时需要提醒Windows,没有人再连接到该端口。

© www.soinside.com 2019 - 2024. All rights reserved.