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