Вопрос

Я пишу некоторый код для интерфейса с куском оборудования. Аппаратное обеспечение подключается к ПК через 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 между символами исправляет проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top