我正在尝试通过测试COM端口的“可打开性”来进行“飞行前检查”,然后启动一个允许用户进行报告的对话窗口。
这是代码序列,概括为:
handle = CreateFile("\\\\.\\COM4:", GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);
if (handle != INVALID_HANDLE_VALUE)
{
CloseHandle(handle);
DoTheWork("\\\\.\\COM4:");
}
else
{
ShowMessage("I'm sorry Dave, I can't do that");
}
...
void DoTheWork(char * port)
{
handle = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);
/// do lots of stuff
CloseHandle(port);
}
问题在于:“DoTheWork”是一个久经考验的功能,并且可以自行正确执行。它只在先前的CreateFile / CloseHandle调用之后立即调用时失败,当第二个CreateFile返回E_ACCESSDENIED时。
更糟糕的是,如果我在调试器中慢慢地逐步执行代码,它的工作正常。
在第一个closeHandle之后,似乎我需要一个Sleep(),但这感觉就像一个黑客 - 我无法知道它必须有多长时间。
答案 0 :(得分:2)
系统需要一些时间来关闭资源。可能有一些神秘的方法来测试它是否被释放,但我不知道那是什么。我所知道的是,如果你检查注册表项:
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
您可以看到哪些串口可用,而无需打开它们,这可以解决您的问题。
答案 1 :(得分:1)
在关闭之前尝试在句柄上调用PurgeComm()或FlushFileBuffers()。
答案 2 :(得分:0)
嗯,经过更多的拖网搜索,I found this,与Windows CE而不是Win32相关。
之后有两秒钟的延迟 在端口之前调用CloseHandle 关闭,资源被释放。
我想这同样适用于Win32,但我没有找到任何记录证据。