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

时间:2010-06-01 09:03:28

标签: c++ windows serial-port createfile

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

6 个答案:

答案 0 :(得分:2)

这当然不正常。 Windows会自动关闭进程终止后保持打开的所有句柄。这必定是USB设备驱动程序中的一个缺陷,尽管很难看出它是如何搞砸的。然而,模拟串行端口的那些是众所周知的糟糕的。好吧,你无能为力,但希望制造商提供更新驱动程序。或者来自其他制造商的设备。

答案 1 :(得分:2)

我同意以前的帖子。

  1. 这不是正常情况。
  2. 拔下USB设备通常会有所帮助。
  3. 此问题与FTDI驱动程序中的故障有关,FTDI驱动程序负责实现虚拟COM端口。 另一方面,这些“毛刺”与USB设备的各种故障有关。 (当然这并不能证明FTDI驱动程序的合理性。)

    顺便说一下,一些FTDI驱动程序存在其他几个已知问题:

    • 有时呼叫CloseHandle只是挂起调用线程。
    • 有时,即使关闭后,应用程序仍然在任务管理器中“可见”。任务管理器无法终止应用程序,并且调试器无法附加到它。其EXE文件被锁定(无法删除)。

    通常在这些情况下立即拔出USB设备。 FTDI驱动程序似乎在“等待某事”醒来。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您不希望发生的另一件事是拥有一个开放的USB串行端口,用户将USB连接到串行适配器。那个bug已经存在了很长时间。这是错误的答案

“Microsoft于2009年3月27日下午4:03发布 嗨, 感谢您报告此问题。我们已经意识到这个问题并已修复 它是.NET框架的下一个主要版本。

如果您有任何疑虑,请重新启用此问题,我会尽快回复。 谢谢, 金汉密尔顿 基类库“

不知道问题是否相关。 Microsoft Connect报告了多个USB串行错误。

答案 4 :(得分:0)

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

试 {    HANDLE hPort = NULL;    hPort = CreateFile(...);    //你编码......

} 赶上(...) {    if(hPort!= NULL)        CloseHandle的(hPort); }

答案 5 :(得分:-1)

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