2007年9月1日土曜日

.NET SerialPort の IsOpen() の戻り値がおかしいときがある

.NET SerialPort の IsOpen()メソッドですが、
シリアルポートがすでにオープンしているかどうかを
調べるために使用すると思うのですが、
ちゃんと検出してくれないときがあります。

例えば、COM1 を別のアプリケーションで使用(オープン)しているときに、
IsOpen()を使用すると、false(クロース状態)で返します。


-- 別のアプリケーションで COM1オープン中 --
if( serialPort1->IsOpen::get() == false ){ // ここでは false が返る
serialPort1->Open();
}


よって、続けて Open()メソッドを実行すると以下のエラーが出ます。

----------------------------------------------------------------
'System.UnauthorizedAccessException' のハンドルされていない例外が System.dll で発生しました。
追加情報: ポート 'COM1' へのアクセスが拒否されました。
----------------------------------------------------------------


ところが、COM1がクローズされている状態で Open()メソッドを実行し、
IsOpen()で状態を見ると、ちゃんと true(オープン状態)で返してくれます。


-- COM1クローズ中 --
serialPort1->Open();
if( serialPort1->IsOpen::get() == false ){ // ここでは true が返る
serialPort1->Open();
}


解決方法がわからないので、.NET SerialPort 今は使用しないことにします。
シリアル通信は、CreateFile() を使用しようと思います。

0 件のコメント: