GetQueuedCompletionStatus прекращает чтение последовательного порта - PullRequest
1 голос
/ 11 сентября 2009

У меня есть устройство, которое генерирует сообщения через последовательный порт. Когда я перезагружаю устройство, порт завершения ввода-вывода прекращает чтение байтов.

Код вызывает CallQueuedCompletionStatus ():

BOOL bRet = GetQueuedCompletionStatus(
        m_hCompletionPort, 
        &dwBytesTransferred, 
        &dwCompletionKey, 
        &pOverlapped, 
        INFINITE);

PortMon выглядит так:

...
IRP_MJ_WRITE    Serial1    SUCCESS     LENGTH: 7    REBOOT.
IRP_MJ_READ     Serial1    CANCELLED   LENGTH: 1    

В журнале показывается следующий результат:

bRet=true, dwBytesTransferred=7, pOverlapped=0x0202B028, GetLastError()=997
(sleep forever)

Есть ли способ обнаружить этот сбой и восстановить связь?

Я могу наблюдать за тепловым ударом и закрывать / открывать последовательный порт, но не совсем правильно, что Windows API позволяет последовательной связи молча обрываться так.

Ответы [ 3 ]

1 голос
/ 31 октября 2009

Порты завершения ввода-вывода, безусловно, могут справиться с этим делом без проблем. Вам не нужно закрывать и снова открывать устройство.

Наиболее вероятной проблемой в этом случае является то, что у вас есть ошибка в линии (вызванная сбросом устройства), которую вы не очистили с помощью ClearCommError ().

Вам необходимо использовать SetCommState () и SetCommTimeouts () соответственно для вашего устройства. В DCB, который вы передаете SetCommState (), вам нужно установить fAbortOnError. Если вы удаляете ошибку из очереди, вам нужно вызвать ClearCommError () перед повторным чтением.

1 голос
/ 01 ноября 2009

RE: janm (я не могу добавить комментарий к вашему ответу извините)

Я пытался установить различные флаги, в том числе fAbortOnError DCB, но GetQueuedCompletionStatus () все равно будет ждать бесконечно. Я также пытался периодически отключать вызовы и проверять последовательный порт на наличие ошибок. Последовательный порт всегда выглядел нормально, но отключение все равно навсегда сломало бы порт завершения ввода-вывода. Перезагрузка устройства, вероятно, создает временное состояние ошибки ... Я говорю, вероятно, потому что я никогда не был в состоянии обнаружить его!

У одного из разработчиков тоже была проблема с этой проблемой, и они тоже потерпели неудачу. Поэтому мы просто переписали код, чтобы использовать перекрывающиеся чтения последовательного порта, и теперь он работает нормально.

Возможно, что-то, где-то мы пропустили ... В конце мы потратили больше времени, пытаясь разгадать тайну, чем то, что потребовалось для переписывания кода.

1 голос
/ 11 сентября 2009

Если вы введете WaitForSingleObject на дескрипторе для последовательного порта, который вы открыли для начала чтения данных, станет ли дескриптор сигнализироваться при перезагрузке устройства? Может быть, это способ сказать, когда вам нужно снова открыть порт?

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