11

いくつかの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プロトコルを使用する医療用モニターです。とにかく、私はデバイスへの接続が正常に機能しています。問題があるのはシリアルポートが開いていることだけです。オープン時のシリアル制御ラインの状態はこれと関係がありますか?もう一方のデバイスは、ポートをポーリングして通信するさまざまなものを探しているため、問題が発生した瞬間にシリアル回線がどのように表示されるかわかりません。

4

2 に答える 2

1

OK、解決しなければ問題は理解できます。別のシリアルデバイスで遊んでいたところ、問題がさらに頻繁に発生し始めました。

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

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

VMが4つのポートを所有している場合、残りの4つのポートで開くと、完了するまでに20〜30秒かかることがあります(1000回の試行のうち20〜30回)。VMが実行されていない場合、1000回の試行すべてですぐにオープンが発生します。VMは実行されていますが、USBシリアルポートが所有されていないため、1000回の試行すべてですぐにオープンが発生しました。

VMは開発ツールであり、意図した展開シナリオの一部ではないため、この問題に対処できます。

興味深いことに、この効果は、ポートが最後に使用されたボーレートに依存しているようです。最初の問い合わせの前は、9600ボー以下で操作していたので、問題が発生したことを思い出せません。私が最初に質問したとき、私は115000ボーのデバイスで作業していて、断続的に問題が発生していました。460800ボーの最新のデバイスでは、問題を突き止めることができるほど頻繁に問題が発生します。理由はわかりませんが、あります。

于 2012-08-21T15:17:51.820 に答える
0

デバイスドライバの問題と相互作用するシリアル制御ラインが原因である可能性があります。

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

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

これで問題が解決した場合は、開いたときの制御信号を無視するようにドライバー設定を探す必要があります。

于 2012-07-24T08:42:22.587 に答える