У меня есть приложение Qt (Qt 4.8.1), которое выполняет некоторые задачи последовательного порта Windows. Я нахожу, что иногда вызов CreateFileA, который я делаю для открытия последовательного порта, занимает до 30 секунд! Очевидно, я делаю что-то, чтобы вызвать это странное поведение, и я хочу знать, что я могу сделать для этого.Что может привести к тому, что вызовы CreateFile на последовательном порту будут чрезвычайно медленными?
m_portHand = CreateFileA(portDevice.c_str(),
GENERIC_READ | GENERIC_WRITE,
0, // must be opened with exclusive-access
NULL, // default security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL); // hTemplate must be NULL for comm devices
m_portHand является HANDLE, и portDevice является станд :: строка и содержит "COM5".
Этот вызов запускается нажатием кнопки в основном потоке моего приложения. В то время это приложение имеет не более одного другого потока, но эти потоки (если они есть) простаивают.
Единственная важная вещь, которая происходит в системе, - это виртуальная машина под управлением Linux, но система представляет собой четырехъядерный процессор, а 3 ядра находятся почти в режиме ожидания, как вы видите в окне Windows, причем только один делает что-либо с ВМ.
Последовательные порты на 8-портовом последовательном USB-порту, это может быть связано?
Связано ли это с перекрытием IO?
В ответ на замечания:
Порт не открыт другим приложением. Порт ранее был открыт предыдущим вызовом этого приложения, которое было правильно закрыто, а порт закрыт с помощью «CloseHandle».
Я не смог определить какие-либо корреляции между ними, занимая 30 секунд, а не - иногда я запускаю приложение, нажимаю кнопку, и мы уходим на гонки, иногда это занимает до 30 секунд.
VM перехватывает некоторые другие USB-устройства в одном и том же серийном окне.
Помимо серийной коробки (с запросом на поиск виртуальных машин в 4 портах для поиска устройств), USB-шина выгружается.
Я не видел поведения в других приложениях. Я попробую переключиться на встроенный порт (COM1 на материнской плате), чтобы убедиться, что это имеет какой-то эффект.
Мне пришла в голову мысль: может ли форма адреса порта иметь какое-либо отношение к ней? Другие подобные приложения, над которыми я работаю, используют библиотеку qestserialport, которая открывает порты, используя ноту «\\. \ COM #». Есть ли способ, которым используемая нотация может повлиять на время?
Последовательное устройство USB сообщает об этом «VScom», и обычно оно открывается сразу (< 10 миллисекунд для вызова CreateFile). Это всего лишь случайная проблема, когда вещи накапливаются, и у меня есть другие программы, которые НИКОГДА не проявляют такого поведения.
Устройство, с которым я разговариваю, является медицинским монитором, использующим протокол IEEE 11073. Во всяком случае, у меня есть соединение с устройством, работающим просто отлично, это ТОЛЬКО открытый последовательный порт, что проблематично. Могло ли состояние последовательных линий управления в открытое время иметь какое-то отношение к этому? Устройство на другом конце опроса его портов ищет различные вещи, чтобы поговорить, поэтому я понятия не имею, как выглядят серийные строки в тот момент, когда все идет не так.
Открыт ли порт другим приложением? Возможно, он ждет выхода мьютекса или блокировки. –
Вызывающий вызов 'CreateFileA()' выглядит нормально. В каких обстоятельствах это займет 30 лет? Сразу после подключения вашего USB-устройства? Вы пытались получить это поведение в других приложениях? Вы пытались получить это поведение с другим COM-портом? Насколько занят ваш USB-шина? У вас есть USB-перехватывающие USB-устройства? – tinman
Последовательные порты открываются довольно быстро в моем опыте, даже при подключении многих USB-портов COM. Каким брендом являются последовательные порты USB, которые вы используете? –