Win32 API: readfile не времени
-
09-10-2019 - |
Вопрос
Я пишу некоторый код для интерфейса с куском оборудования. Аппаратное обеспечение подключается к ПК через USB с USB-последовательным преобразователем внутри устройства (отображается в виде устройства COM-порта в Windows).
У меня проблемы с помощью системы Readfile Win32 API. Я не могу получить его на работу как рекламируемый. Я настроил структуру CommTimeouts так:
COMMTIMEOUTS ct;
ct.ReadIntervalTimeout = MAXDWORD;
ct.ReadTotalTimeoutconstant = 0;
ct.ReadTotalTimeoutMultiplier = 0;
ct.WriteTotalTimeoutConstant = 0;
ct.WriteTotalTimeoutMultiplier = 0;
if(SetCommTimeouts(device_id_, &ct) == 0)
{
return ERROR; // this is never hit.
}
Который согласно документации API Win32 говорит:
Readintervaltimeout.
Максимальное время разрешено проходить между прибытием двух байтов на линии связи, в миллисекундах. Во время операции readfile период времени начинается, когда получен первый байт. Если интервал между прибытием любых двух байтов превышает эту сумму, Readfile Операция завершается, и любые буферизованные данные возвращаются. Значение нуля указывает на то, что интервальные тайм-ауты не используются.
Значение maxdword, в сочетании с нулевыми значениями для обоих ReadTotaltimeOutConstant. и Readtotaltimeoutmultiplier Члены, указывают, что операция чтения - немедленно вернуться с байтами, которые уже были получены, даже если байты не были получены.
Команда, которую я отправляю, предполагается вернуть одностерное байтовое целое число. В большинстве случаев команда получена устройством, и он возвращает соответствующее значение. Иногда, однако, не так, кажется, не возвращает значения и readfile () блоков, пока не получится больше байтов (например, нажав кнопки на устройстве). Как только кнопка поражена, начальный целочисленный ответ, который я ожидал, получен вместе с кнопкой прессы кода. Хотя это не поведение, я ожидаю от самого устройства, я больше обеспокоен ReadFile () блокировкой, когда он не должен быть, согласно документации MSDN. Есть ли лекарство для ReadFile () блокировки здесь?
Решение
Ох! Оказывается, readfile Blocking была просто симптомом, а не проблема. Устройство аппаратного устройства только имеет процессор 4 МГц. Разделение 3-х символьных команд, записанных на устройство, и отправка их индивидуально с помощью паузы 1MS между символами исправляет проблему.