2012-07-17 16 views
11

Windowsのシリアルポートタスクを実行しているQtアプリケーション(Qt 4.8.1)があります。シリアルポートを開くために行う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はハンドルであり、portDeviceはstd :: stringであり、 "COM5"を含みます。

この呼び出しは、アプリケーションのメインスレッドのボタンプッシュによってトリガーされます。当時、アプリはたかだか他のスレッドを1つしか持っていませんでしたが、それらのスレッドがあればそれはアイドルです。

システムで起こっている唯一の主なものは、Linuxを実行しているVMですが、システムはクアッドコアであり、コアのうち3つはWindowsのボックスに表示されているようにアイドルに近いものですVMとの接続

シリアルポートは8ポートUSBシリアルボックスにありますが、それは関連する可能性がありますか?

これは、何らかの方法でオーバーラップIOに関連していますか?コメントに応えて

ポートが別のアプリケーションによって開かれていません。ポートは以前にこのアプリケーションの以前の呼び出しによって開かれていましたが、これは正しく閉じられていて、ポートは 'CloseHandle'で閉じられました。

私は30秒を要している間の相関関係を特定できませんでした - 時々私はアプリケーションを起動し、ボタンをクリックしてレースに出ます。時には30秒かかることもあります。

VMは、同じシリアルボックス上の他のいくつかのUSBデバイスをインターセプトしています。

シリアルボックス(VMをポーリングしてデバイスを探す4つのポート)以外は、USBバスがアンロードされます。

他のアプリでの動作は見ていません。内蔵ポート(マザーボード上のCOM1)に切り替えて、それが何らかの効果を持っているかどうかを確認します。

私の考えはちょうど私に起こりました:ポートアドレシングの形式は、それと関係がありますか?私が作業しているその他の同様のアプリケーションは、 '\\。\ COM#'表記を使用してポートを開くqestserialportライブラリを使用します。使用されている表記がタイミングに影響を与える可能性がありますか?

USBシリアルデバイスには「VScom」と表示され、通常はすぐに開きます(<はCreateFile呼び出しで10ミリ秒)。物事が詰まってしまうのはたまに問題になるだけで、私はこのような現象を起こしていないようなプログラムもあります。

私が話しているデバイスは、IEEE 11073プロトコルを使った医療用モニターです。とにかく、私はデバイスに接続するだけで正常に動作している、それは問題のシリアルポートを開いているだけです。オープン時のシリアル制御線の状態はこれと何か関係がありますか?他の端末のデバイスは、さまざまなものを探してポートをポーリングしているので、問題が起こったときにシリアルラインがどのように見えるかはわかりません。

+0

ポートは別のアプリケーションによって開いていますか? mutexやロックが解放されるのを待っているのかもしれません。 –

+0

あなたが表示する 'CreateFileA()'呼び出しはOKと思われます。どのような状況で30秒かかるのですか?あなたのUSBデバイスを差し込んだ直後?あなたは他のアプリケーションでこの動作をしようとしましたか?別のCOMポートでこの動作をしようとしましたか?あなたのUSBバスはどのくらいビジーですか? VMがUSBデバイスを傍受していますか? – tinman

+1

多くのUSB COMポートが接続されていても、私の経験ではシリアルポートはかなり速く開いています。使用しているUSBシリアルポートはどのブランドですか? –

答えて

1

OK、解決しなければ問題は分かります。私は別のシリアルデバイスで遊んでいたので、問題はさらに頻繁に現れ始めました。

問題は、VMがシリアルポートの一部を制御しているときに、ドライバが断続的に使用可能なポートを開くのが遅くなっているようです。

私のテストプログラムが開き、オープンコールをタイミングしてポートを1000回閉じます。シリアルポートのパラメータは決して設定しません。テストプログラムを実行する前に、ボーレート460800を使用するデバイスで実際の作業を行っていました。

VMが4つのポートを占有している場合、残りの4つのポートでオープンすることがあります1000回の試行のうち30回)が完了するまでに20〜30秒かかります。 VMが実行されていないときは、1000回の再試行がすべて迅速に実行されます。 VMは稼働していても、USBシリアルポートは存在しないため、1000回の試行ですべてオープンしました。

VMは私たちの意図する展開シナリオの一部ではなく、開発ツールなので、私はこの問題に取り組むことができます。

興味深いことに、この効果はポートが最後に使用されたボーレートに依存しているようです。私の最初の問い合わせに先立って、私は9600ボーで動作していましたが、これまで問題を見ていることは思い出されません。私が最初に質問したとき、私は115000ボーで、断続的に問題を抱えていたデバイスで作業していました。最新のデバイスを460800ボーで使用すると、問題を頻繁に解決して問題を解決することができます。理由は分かりませんが、そこにはあります。

0

デバイスドライバの問題と相互作用するシリアル制御ラインが考えられます。

制御信号が正しく接続されていますか?

そうでない場合は、RTSをCTSに接続し、CD、DTR、DSRを接続します。 DB25では、ピン4とピン5と接続ピン6と8と20を接続することを意味します.DB9ではピン7と8を接続し、ピン1,4と6を接続します。

これで問題が解決した場合は、オープン時に制御信号を無視するドライバ設定を探します。

関連する問題