DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SerialPortOpen中にケーブル断でCPU100%

環境/言語:[WindowsXP(SP2) C#]
分類:[.NET]

はじめまして、よろしくお願いします。

System.IO.Ports.SerialPortクラスを使用してシリアル通信を行うプログラムを書いています。
USB<->シリアル変換ケーブル(IODATAのUSB-RSAQ3)を挿した状態で作られるCOMポートに対して通信するようにしています。

port = new SerialPort("COM1");
port.Open();

上記コードを実行した後、USBケーブルを引っこ抜くとCPUが100%になってしまい、アプリを終了しない限り元の状態には戻りません。

ようはエラーが発生しているのならそれをキャッチしたいのですが、どうすればキャッチできるのか方法が見つかりません。
どなたかご経験のあるかたおられないでしょうか?
> 上記コードを実行した後、USBケーブルを引っこ抜くとCPUが100%になってしまい、アプリを終了しない限り元の状態には戻りません。
>
> ようはエラーが発生しているのならそれをキャッチしたいのですが、どうすればキャッチできるのか方法が見つかりません。
> どなたかご経験のあるかたおられないでしょうか?

  USB・シリアル変換アダプタのドライバの問題に起因するところ
  が大きいように思いますが、当該シリアルポートをオープンしてい
  り最中に、そのUSB変換アダプタが引き抜かれることは、メーカ
  側も想定していないと思います。

  エラーをキャッチできるかは解りませんが、何がしかのデバイスの
  増減があった場合、WndProc に、WM_DEVICECHANGE のメッセージが
  飛んできますので、それを捕捉したら、それがUSB変換アダプタ
  であるか調べてみて、当該デバイスであったらシリアルポートを閉
  じてみる。とか・・・

  ただそのシリアルポートはオープンされているので、デバイス的に
  はロック状態。その状態で果たしてWM_DEVICECHANGEメッセージが
  飛んでくるのか・・・は、ドライバーかOSの振る舞いに依存する
  と思いますので保証限りではないかと・・・

  あくまで参考と言うことで・・・

以上。
テストしてみました・・・
USB・シリアル変換アダプタのメーカーによって差異はあるようです。
PLANEXのものでは、CPU負荷は、何も変化せず・・・
ただし、シルアルポートを閉じた際には、例外がスローされ・・・

この例外を捕捉するには、
http://dobon.net/vb/dotnet/programing/unhandledexception.html
ここの後半に書かれている方法で取れました。

WndProcには、デバイスチェンジのメッセージが正常に飛んでくるので
そこから当該デバイスが無くなったのか再認識されたか調べれば問題ない
かと。

注意点としては・・・
USB・シリアル変換アダプタを調べる方法としては、WMI使ったりし
ますが、正しく列挙されない場合があります。メーカーのドライバの出来
に依存します。そのドライバ作ったプログラマが知らなかっただけでしょ
うが・・・お持ちのUSB・変換アダプタの有り無しを調べる方法につい
ては、別途、チャレンジしてみて下さい。

以上。
オショウ様、レスありがとうございます。

> テストしてみました・・・
お時間取らせてすみません。ありがとうございました。

> USB・シリアル変換アダプタのドライバの問題に起因するところ
> が大きいように思いますが、当該シリアルポートをオープンしてい
> り最中に、そのUSB変換アダプタが引き抜かれることは、メーカ
> 側も想定していないと思います。
>
> USB・シリアル変換アダプタのメーカーによって差異はあるようです。
> PLANEXのものでは、CPU負荷は、何も変化せず・・・
なるほどです。.NETFrameworkのバグかと思ってました..。

> WndProcには、デバイスチェンジのメッセージが正常に飛んでくるので
> そこから当該デバイスが無くなったのか再認識されたか調べれば問題ない
> かと。
アドバイスありがとうございます。
何とかデバイスチェンジで当該デバイスが無くなったことは取得することができました。
その後、SerialPortをCloseして例外を発生させると、CPU100%は止まりました!
例外はキャッチしているので、アプリを終了する必要もなく元の状態に戻りました。
#なぜか例外が発生するとCPU負荷が元に戻る..。

一応はまともに動いている感じになりました。

しかし、アダプタを抜いたとたんにCPU100%になるので、当該デバイスを
検索する処理に時間がかかってしまいます。
これは仕方ないのでしょうか?
> しかし、アダプタを抜いたとたんにCPU100%になるので、当該デバイスを
> 検索する処理に時間がかかってしまいます。
> これは仕方ないのでしょうか?

  そのアダプタのメーカーのドライバの出来に依存しますので
  メーカーに文句言ってみるとか・・・

  諦めて他社アダプタに変更してみるとか・・・

  何社かありますが、RATOCのがいい・・・と聴いたことが
  ありますが、私は使っていません。かなり高速な通信を行って
  も耐えるそうですが、引き抜きは解りません。

以上。
御世話になります。

さっそく他社のアダプタを探し、サン電子のものがあったので試してみたら、現象は発生しませんでした。

>   何社かありますが、RATOCのがいい・・・と聴いたことが
>   ありますが、私は使っていません。かなり高速な通信を行って
>   も耐えるそうですが、引き抜きは解りません。
情報ありがとうございます。
が、試せないものは怖くて購入できないっす..。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板