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

C++ 如果未使用CloseHandle正确关闭,则重新打开串行端口失败,c++,windows,serial-port,createfile,C++,Windows,Serial Port,Createfile,我正在Windows上使用USB设备,该设备被视为虚拟串行端口。我可以使用CreateFile和ReadFile函数与设备通信,但在某些情况下,当开发中的应用程序崩溃时,我的应用程序不会调用CloseHandle。在此之后,所有调用CreateFile失败错误\u访问\u被拒绝,唯一的解决方案是再次登录到我的计算机。有没有办法强制关闭打开的句柄或以编程方式重新打开?这肯定不正常。进程终止后,Windows会自动关闭所有保持打开状态的句柄。这一定是你的USB设备驱动程序中的一个缺陷,尽管很难看出它

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

这肯定不正常。进程终止后,Windows会自动关闭所有保持打开状态的句柄。这一定是你的USB设备驱动程序中的一个缺陷,尽管很难看出它是怎么搞砸的。然而,那些模拟串行端口的是出了名的糟糕。嗯,除了希望制造商更新驱动程序之外,你什么也做不了。或其他制造商的设备。

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

我同意前面的两篇文章

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

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

有时对CloseHandle的调用只是挂起调用线程。 有时,应用程序在任务管理器中仍然可见,即使在关闭后也是如此。任务管理器无法终止应用程序,调试器也无法附加到该应用程序。其EXE文件已锁定,无法擦除。
通常,在这些情况下,拔下USB设备会立即有所帮助。FTDI驱动程序似乎在等待什么东西被唤醒。

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

您不希望发生的另一件事是有一个打开的usb串行端口,并且用户拉usb到串行适配器。那只虫子是什么?已经存在很长时间了。这是一个错误的答案

微软于2009年3月27日下午4:03发布 你好 感谢您报告此问题。我们意识到这个问题,并已修复了它 它将用于.NET framework的下一个主要版本

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


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

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

try
{
   HANDLE hPort = NULL;
   hPort = CreateFile(...);
   // You code...

}
catch (...)
{
   if (hPort != NULL)
       CloseHandle(hPort);
}

这与Windows无关。正如valdo和Hans指出的,是设备驱动程序导致了问题。感谢所有的答案。看起来我不是唯一一个有USB到串行问题的人。我目前的解决方法是尝试在循环中延迟调用CreateFile,直到调用成功。现在似乎可以使用,但可能在其他任何计算机上都无法使用。我注意到,有时在windows和/或设备驱动程序意识到设备不再使用之前,我必须关闭正在调试的IDE。看起来不应该是这样,但事实确实如此。任务管理器显示我的应用程序进程正确退出。看起来这是一个设备驱动程序错误。经过进一步测试后,我注意到CreateFile甚至在关闭与CloseHandle的连接后也可能失败。幸运的是,在带有延迟的循环中调用CreateFile似乎可以实现这一目的。通常不到10次就可以重新打开设备。这有什么变化吗?Win7+.NET 4.5也存在同样的问题,只有USB重新加载才有帮助=