Вопрос:
Я работаю над некоторыми базовыми средствами последовательной связи, и я столкнулся с этой проблемой, и я не могу работать. Я пытаюсь установить состояние связи в определенную скорость передачи, стоп-бит, бит четности и размер данных. Как показано в моем примере кода ниже, я получаю текущее состояние COM из getComState и изменяю некоторые значения.
DCB dcb = { 0 }; // for set timeout for readfile function COMMTIMEOUTS timeouts = { 0, // interval timeout. 0 = not used 0, // read multiplier 500, // read constant (milliseconds) 0, // Write multiplier 500 // Write Constant }; if (SetCommTimeouts(usb_device, &timeouts) == FALSE) { «ERROR: SetCommTimeouts failed with error %d.n», GetLastError(); add_log_trace(«ERROR: SetCommTimeouts failed with error %d.n», GetLastError()); } BOOL fSuccess; // Initialize the DCB structure. SecureZeroMemory(&dcb, sizeof(DCB)); dcb.DCBlength = sizeof(DCB); // Build on the current configuration by first retrieving all current // settings. fSuccess = GetCommState(usb_device, &dcb); // Fill in some DCB values and set the com state: // 115,200 bps, 8 data bits, no parity, and 1 stop bit. dcb.BaudRate = CBR_115200; // baud rate dcb.ByteSize = 8; // data size, xmit and rcv dcb.Parity = NOPARITY; // parity bit dcb.StopBits = ONESTOPBIT; // stop bit fSuccess = SetCommState(usb_device, &dcb);
Однако эта функция, как правило, меня не касается, независимо от того, что я делаю. Ошибка довольно проста (код ошибки 87), что означает, что существует недопустимый параметр. После некоторых исследований решение кажется довольно очевидным. Тем не менее, я пробовал решения, перечисленные ниже, включая некоторые тесты на здравомыслие, и ничего не работает.
- Установка структуры DCB только для инициализации с размером
- Отключение рукопожатия в структуре DCB
- Установка структуры DCB без значений
- Использование альтернативного способа установки структуры DCB помимо GetCommState
- Установка CommState в том же состоянии, которое я получаю из GetCommState
- Обеспечение правильности имени COM-порта при открытии файла
Я также принял во внимание замечания, оставленные разработчиками MSDN в отношении использования функции SetComState, однако вызов функции продолжает терпеть неудачу.
Я попытался запустить аналогичный код в ящике Linux, и настройка COM-порта прекрасна. Я столкнулся с некоторыми статьями, в которых говорится, что Windows испортила файл usbser.sys, который обрабатывал связь между ОС и устройством.
- Доступ к COM-порту с Windows 10
- Проблемы с последовательным интерфейсом USB с Windows 10
У меня возникает соблазн попробовать заменить файл usbser.sys на более старый, но мне хотелось получить второе мнение по этому вопросу. Это распространенная проблема? Есть ли более прямолинейное решение? Я был бы признателен, если бы кто-то мог указать мне в правильном направлении или исправить меня в некоторых моих предположениях и методологии. Надеюсь, этот пост не слишком подходит с точки зрения объема. Я просто пытаюсь установить скорость бод с помощью SetCommState. Lolz.
спасибо