Я пишу код для взаимодействия с оборудованием. Оборудование подключается к ПК через USB-порт с преобразователем USB-to-Serial внутри устройства (в Windows он отображается как устройство с COM-портом).
У меня проблемы с системным вызовом Win32 API ReadFile. Кажется, я не могу заставить его работать, как рекламируется. Я установил структуру 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 ()?
SetCommTimeouts
? - person casablanca   schedule 21.10.2010