【发布时间】:2012-02-11 17:35:23
【问题描述】:
我正在努力弄清楚串行端口何时完成关闭,以便我可以重新打开它。原来CloseHandle()在端口真正解锁之前就返回了。
我正在使用CreateFile(FILE_FLAG_OVERLAPPED) 打开一个串行端口,使用CreateIoCompletionPort() 将其与CompletionPort 相关联,使用ReadFile()、WriteFile() 对其进行读/写,并使用CloseHandle() 将其关闭。
我注意到,如果我足够快地关闭并重新打开一个串行端口,我会从CreateFile() 收到一个ERROR_ACCESS_DENIED。尽管我正在等待CloseHandle() 返回,然后等待与该句柄关联的所有未完成的读/写操作从完成端口返回,但这种情况仍在发生。当然有更好的方法:)
如何同步关闭串行端口?请不要重试循环、sleep() 或其他一些廉价的黑客攻击。
编辑:也许这与我使用完成端口和 FILE_FLAG_OVERLAPPED 有关。当读/写操作完成时,我会收到一个回调。端口关闭是否有某种回调?
【问题讨论】:
-
可能和你具体的串口驱动有关。你在 SO 上看到过这个吗:stackoverflow.com/questions/2948428/…
-
只是为了确定......你没有在任何地方使用过
DuplicateHandle? -
我不确定完成端口是否相关,我一直使用带有
ReadFileEx和WriteFileEx的APC 回调。这也更简单,因为 APC 仅在线程进入警报等待时才运行,因此没有跨线程同步问题(只是要小心重入)。 -
我怀疑这是由不完整的 I/O 请求引起的。但是从根本上解决问题,关闭串口并重新打开它是没有意义的。
-
实际上,这不是串行端口所独有的,我不认为这是你做错了什么。我在文件句柄上看到了同样的问题。 CloseHandle 返回的时间与实际释放的对象之间存在明显的滞后。我怀疑最终你会发现一些涉及重试循环和睡眠的廉价黑客将是唯一的解决方案。
标签: windows winapi serial-port iocp io-completion-ports