Обнаружение, если COM-порт закрыт - PullRequest
1 голос
/ 13 февраля 2012

Я читаю COM-порт Bluetooth, получаю данные с микроконтроллера. После инициализации порта я использую это, чтобы прочитать порт:

while(1)
if(WaitCommEvent(com_hnd, &dwEventMask, NULL))

Это работает нормально, но если я закрою COM-порт, программа будет ждать в этом цикле вечно, не обнаруживая факта, что COM-порт пропал (у меня есть еще для этого if (), где я проверяю на ошибки ).

Как я могу проверить и проверить, открыт ли он еще?

1 Ответ

2 голосов
/ 13 февраля 2012

Как уже предлагалось в комментариях, вам, вероятно, понадобится какой-нибудь внешний способ остановить ожидание, например, событие + WaitForMultipleObjects ().Вы также можете дождаться фактического дескриптора COM-порта, полученного из CreateFile.

Вам действительно нужно использовать WaitCommEvent?Насколько я знаю, эта функция нужна вам только в том случае, если вы используете сигналы рукопожатия и другие подобные странности.Вы можете использовать ReadFile, если вас интересуют только данные.По моему опыту, эта функция более надежна.

Я работал с аналогичными устройствами COM-портов, и самый надежный способ определить, что они были отключены, похоже, проверяет результат ReadFile:

BOOL result;

result = ReadFile(...);

if(result == FALSE)
{
  DWORD last_error = GetLastError();
  if(last_error == ERROR_OPERATION_ABORTED)  // disconnected ?
  {
    close();                                 // close the port
  }
}

Я, конечно, не уверен, будет ли это работать в вашем конкретном случае, но я использую этот метод в некотором производственном коде, который заканчивается множеством дрянных адаптеров USB-to-serial.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...