質問

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

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

これが機能する場合があります。時々Vistaブルースクリーン。スレッドを使用してすべてのポートを同時にプローブすると、ほとんど常にブルースクリーンになります。すべてを1つのスレッドで実行するように強制すると、それは起こりません。

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


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

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

エピローグ

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

追記

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

役に立ちましたか?

解決

これらの種類のデバイスの1つに対してWindowsドライバーを一度書いたことがあれば、WinDbgで既に知っていることを証明しようとして時間を無駄にしないでください-つまり、使用しているドライバーがバグだということです

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

他のヒント

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

ところで、最近は多くのノートブックにシリアルポートが付属していないので、USB-シリアルコンバータを使用する必要がありますか?その場合、ほとんどの製造元がシリアルポートドライバーを仮想ドライバーとして記述しているため、ドライバーは最初に問題になる可能性があります。

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

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

x64 vistaおよびwin7で安定しているFTDIドライバーがあります。私はFTDIチップセットのみを使用するように言った人の2番目です。

私の近くの店(カナダ、トロント)のusbドングルへの安価なシリアルのほとんどは、FTDIチップのようです。それは決して箱に載っていないので、私はそれを購入し、それが良ければ、私はそれらでいっぱいの箱を買いに行きます。

W

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top