いくつかのWindowsシリアルポートタスクを実行するQtアプリ(Qt 4.8.1)があります。シリアルポートを開くために行う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はstd :: stringであり、「COM5」が含まれています。
この呼び出しは、アプリのメインスレッドでボタンを押すことによってトリガーされます。その時点で、アプリには最大で1つの他のスレッドがありますが、それらのスレッド(存在する場合)はアイドル状態です。
システムで行われている唯一の主要なことはLinuxを実行しているVMですが、システムはクアッドコアであり、3つのコアはWindowsボックスで見られるのと同じくらいアイドル状態に近く、VMで何かをしているのは1つだけです。
シリアルポートは8ポートのUSBシリアルボックスにありますが、それは関連している可能性がありますか?
これは、何らかの形で重複IOに関連していますか?
コメントへの返信:
ポートは別のアプリによって開かれていません。ポートは、適切に閉じられたこのアプリの以前の呼び出しによって以前に開かれ、ポートは「CloseHandle」で閉じられました。
30秒かかることと、そうでないこととの相関関係を特定できませんでした。アプリを起動してボタンをクリックすると、レースに出かけることがあります。最大30秒かかることもあります。
VMは、同じシリアルボックス上の他のいくつかのUSBデバイスをインターセプトしています。
シリアルボックス(VMがデバイスを探す4つのポートをポーリングする)を除いて、USBバスはアンロードされます。
他のアプリでの動作は見たことがありません。内蔵ポート(マザーボード上のCOM1)に切り替えて、効果があるかどうかを確認します。
思いついたのは、ポートアドレス指定の形式はそれと関係があるのでしょうか。私が取り組んでいる他の同様のアプリは、「\\。\ COM#」表記を使用してポートを開くqestserialportライブラリを使用しています。使用される表記がタイミングに影響を与える可能性がある方法はありますか?
USBシリアルデバイスには「VScom」と表示され、通常はすぐに開きます(CreateFile呼び出しの場合は10ミリ秒未満)。これは、物事が詰まるという偶発的な問題であり、この動作を決して示さないように見える他のプログラムがあります。
私が話しているデバイスは、IEEE11073プロトコルを使用する医療用モニターです。とにかく、私はデバイスへの接続が正常に機能しています。問題があるのはシリアルポートが開いていることだけです。オープン時のシリアル制御ラインの状態はこれと関係がありますか?もう一方のデバイスは、ポートをポーリングして通信するさまざまなものを探しているため、問題が発生した瞬間にシリアル回線がどのように表示されるかわかりません。