Win32 API: время чтения файла не истекло - PullRequest
1 голос
/ 21 октября 2010

Я пишу некоторый код для взаимодействия с частью аппаратного обеспечения.Аппаратное обеспечение подключается к ПК через USB с помощью конвертера USB-Serial внутри устройства (в Windows он отображается как устройство с COM-портом).

У меня проблемы с системой 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.
}

Который согласно документации Win32 API говорит:

ReadIntervalTimeout

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

Значение MAXDWORD в сочетании с нулевыми значениями для обоих элементов ReadTotalTimeoutConstant и ReadTotalTimeoutMultiplier указываетчто операция чтения должна немедленно вернуться с уже полученными байтами, даже если не было получено ни одного байта.

Команда, которую я отправляю, должна вернуть одно байтовое целое число.Большую часть времени команда получает устройство и возвращает соответствующее значение.Однако иногда кажется, что он не возвращает значение и блоки ReadFile () до тех пор, пока не будет получено больше байтов (например, нажатием кнопок на устройстве).Как только кнопка нажата, первоначальный целочисленный ответ, который я ожидал, получен вместе с кодом нажатия кнопки.Хотя это не то поведение, которого я ожидаю от самого устройства, я больше обеспокоен блокировкой ReadFile (), когда это не должно быть, согласно документации MSDN.Есть ли здесь средство от блокировки ReadFile ()?

1 Ответ

0 голосов
/ 21 октября 2010

D'Oh!Оказывается, блокировка ReadFile была всего лишь симптомом, а не проблемой.Данное аппаратное устройство имеет только процессор 4 МГц.Разделение трехсимвольной команды, записанной на устройство, и индивидуальная отправка их с паузой в 1 мс между символами устраняет проблему.

...