关闭并立即重新打开COM端口失败:为什么?

时间:2009-08-20 16:14:33

标签: winapi serial-port createfile

我正在尝试通过测试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(),但这感觉就像一个黑客 - 我无法知道它必须有多长时间。

3 个答案:

答案 0 :(得分:2)

系统需要一些时间来关闭资源。可能有一些神秘的方法来测试它是否被释放,但我不知道那是什么。我所知道的是,如果你检查注册表项:

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

您可以看到哪些串口可用,而无需打开它们,这可以解决您的问题。

答案 1 :(得分:1)

在关闭之前尝试在句柄上调用PurgeComm()或FlushFileBuffers()。

答案 2 :(得分:0)

嗯,经过更多的拖网搜索,I found this,与Windows CE而不是Win32相关。

  

之后有两秒钟的延迟   在端口之前调用CloseHandle   关闭,资源被释放。

我想这同样适用于Win32,但我没有找到任何记录证据。