Отличительное устройство отключается от таймаутов - PullRequest
2 голосов
/ 19 июля 2011

При использовании ReadFile на коммуникационном ресурсе можно обнаружить тайм-ауты чтения, проверяя, было ли прочитано меньше байтов, чем запрошенное количество байтов.Например, когда я хочу прочитать 1 байт, в случае таймаута чтения возвращается 0 байт, и функция завершается успешно.

Однако, когда я отключаю устройство (после чтения некоторых байтов) от COM-порта.Перенесите и запустите операцию чтения на своем старом дескрипторе, происходит то же самое: функция завершается успешно и сообщает, что было возвращено 0 байт.

Как я могу различить отключение устройства и простой тайм-аут чтения, поскольку в настоящее время нет данныхдоступно?

В настоящее время я проверяю, было ли возвращено 0 байт, и если да, я проверяю, подключено ли устройство с помощью WMI.Тем не менее, это не выглядит очень чистым, и я надеюсь, что я могу найти лучшее решение здесь.

Обновление

Еще немного информации об устройстве (как спрашивается в комментариях)):

dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;

CTS и DSR устанавливаются как во время передачи данных, так и после того, как устройство отключается путем отсоединения кабеля от порта USB.

Ответы [ 2 ]

0 голосов
/ 29 января 2013

Просто для полноты:

В Linux, чтение и выбор также возвращают 0, но tcgetattr вернет ошибку при отключении и 0 при тайм-ауте, так что это один из способов сделать это.

0 голосов
/ 19 июля 2011

Если вы используете Windows, вам, возможно, понадобится SetCommTimeoutsFunction .Вам также следует проверить другие функции связи для работы с RS232.

Редактировать: У меня была очень похожая ситуация при перемещении некоторого кода с портативного устройствас фактическим RS232, к одному с USB RS232.Покачайте USB, и порт будет «потерян» без ведома приложения.Код, который я написал, чтобы обойти это, выглядит следующим образом (платформа Win32)

COMMTIMEOUTS    CTO;
CTO.ReadIntervalTimeout = 500;
CTO.ReadTotalTimeoutConstant = 500;
CTO.ReadTotalTimeoutMultiplier = 0;
if (SetCommTimeouts(hPort,&CTO) == 0)
{ 
    DWORD dwError = GetLastError();
    if (dwError == 5)   
    {
        // Access denied, possibly loose USB, return error code or throw exception
        return Housten__We_have_a_problem;
    }
}
...