Из-за чего вызовы CreateFile через последовательный порт могут выполняться очень медленно?

У меня есть приложение Qt (Qt 4.8.1 ), которое выполняет некоторые задачи последовательного порта Windows. Я обнаружил, что иногда вызов CreateFileA, который я делаю для открытия последовательного порта, занимает до 30 секунд! Очевидно, я делаю что-то, чтобы вызвать это странное поведение, и я хочу знать, что я могу сделать, чтобы вызвать это.

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-коробке, может ли это быть связано?

Это как-то связано с Overlapped IO?

В ответ на комментарии:

Порт не открыт другим приложением. Порт был ранее открыт предыдущим вызовом этого приложения, которое было правильно закрыто, а порт закрылся с помощью «CloseHandle».

Я не смог определить какой-либо корреляции между тем, что это занимает 30 секунд, и не -иногда я запускаю приложение, нажимаю кнопку, и мы начинаем гонки, иногда это занимает до 30 секунд.

Виртуальная машина перехватывает некоторые другие USB-устройства на том же серийном блоке.

За исключением последовательного блока (с виртуальной машиной, опрашивающей 4 порта в поисках устройств ), шина USB не загружена.

Я не видел поведения в других приложениях.Я попробую переключиться на встроенный -порт (COM1 на материнской плате ), чтобы посмотреть, повлияет ли это.

Мне только что пришла в голову мысль :может форма адресации портов как-то связана с этим? Другие подобные приложения, над которыми я работаю, используют библиотеку qestserialport, которая открывает порты с использованием нотации '\\.\COM #'. Есть ли способ, которым используемая нотация может повлиять на время?

На последовательном USB-устройстве написано «VScom», и обычно оно открывается сразу (< 10 миллисекунд для вызова CreateFile ). Это просто случайная проблема, когда что-то забивается, и у меня есть другие программы, которые НИКОГДА не проявляют такого поведения.

Устройство, с которым я говорю, — это медицинский монитор, использующий протокол IEEE 11073. Во всяком случае, у меня подключение к устройству работает нормально, проблема заключается ТОЛЬКО в том, что последовательный порт открыт. Может ли иметь к этому какое-то отношение состояние серийных линий управления в открытое время? Устройство на другом конце опрашивает свои порты в поисках разных вещей, с которыми можно поговорить, поэтому я понятия не имею, как выглядят последовательные линии в тот момент, когда что-то идет не так.

11
задан Michael Kohne 21 August 2012 в 15:18
поделиться