2

ポートでコマンドを発行して応答をリッスンすることにより、SerialPort にデバイスが存在するかどうかを確認する C# コードをいくつか作成しました。ポート速度を設定し、ポートを開き、シリアル ストリームを取得して処理を開始すると、常に 100% 動作します。ただし、一部のデバイスは異なる速度で動作するため、接続を自動ネゴシエートし、デバイスの存在を検出するために、さまざまな速度でデバイスをプローブしようとしています。

これらすべてを単一のスレッドで実行しても問題はありません。ただし、10 の速度での 3​​ 秒のタイムアウトは、シリアル ポートごとに 30 秒であり、いくつかある場合があります。したがって、すべてのポートを同時にプローブする必要があります。

時々これはうまくいきます。時々 Vista のブルースクリーン。スレッドを使用してすべてのポートを同時にプローブすると、ほぼ常にブルースクリーンになります。すべてを 1 つのスレッドで強制的に実行すると、決して起こりません。

USB シリアル Prolific PL-2303 アダプターが x64 ドライバーで使用されています。


@Vinko - ミニダンプの読み取りに関するヒントをありがとう。

私が知る限り、問題の核心は、別のスレッドから新しい非同期 I/O 操作を開始することで、オーバーラップした I/O にまったく新しい意味を与えることができ、ドライバー内で競合状態が引き起こされることです。ドライバーはカーネル モードで実行されるため、BLAM!

エピローグ

キックオフを除き、コールバック ハンドラーの外部で BeginXxx を使用しないでください。また、EndXxx を呼び出すまで BeginXxx を呼び出さないでください。カーネル モードで実行されるドライバー コードで競合状態が発生するためです。

あとがき

これはソケットストリームにも当てはまることがわかりました。

4

4 に答える 4

2

これらの種類のデバイスの 1 つに対して Windows ドライバーを作成した経験があるので、WinDbg を使用して、既に知っていること (つまり、使用しているドライバーにバグがあること) を証明しようとして時間を無駄にしないようにアドバイスします。

PL2302 から最新のドライバーを見つけることができる場合は、それを試してみてください。ただし、USB->シリアル アダプターを使用する必要がある場合は、FTDI ベースのアダプターが最適です。(それらは私がドライバーを書いたものでもありません...)

于 2008-11-05T14:49:35.200 に答える
2

System Properties\Advanced\Start and Recovery\Settings で「自動再起動」を無効にすることもできます。これを無効にすると、BSOD が表示され、IRQL_LESS_OR_EQUAL などのエラー メッセージを探すことができます。そのエラー名を検索すると、通常は問題の原因を絞り込むことができます。

ところで、最近ではシリアル ポートを備えたノートブックはあまり多くないので、USB-シリアル コンバーターを使用しているに違いありません。その場合、ほとんどのメーカーはシリアル ポート ドライバーを仮想ドライバーとして記述しているため、最初はドライバーが問題だった可能性があります。

于 2008-11-02T13:51:34.930 に答える
0

BSOD は通常、バグのあるドライバーを意味します。

どの種類の HW ポートを使用していますか? SiLabs CP21xx USB - シリアル コンバーター ドライバーで BSOD が発生しました。

于 2008-11-02T22:56:23.550 に答える