blog.kur.jp

バイオリンと山、自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

.NetのSerialPort.isOpenプロパティが不思議な動作をする

C#でアプリをシリアル通信を行うソフトウェアを作っているのだけれど,良くわからない挙動に出会ったので,メモ.

通常,このようにすれば,アプリからCOM1ポートを開く事が出来る.

serialPort = new System.IO.Ports.SerialPort();
serialPort.BaudRate = 38400;
serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
serialPort.PortName = “COM1”;
serialPort.Open();

しかし,シリアルポートって言うのは通常,一つのアプリからしか利用することができない.このため,既に他のアプリがシリアルポートを使っていないかを確認する必要があり,このために,isOpen()プロパティがある.普通はこんな感じで使うと,ポートが開いているかどうかを知ることができる.

if(serialPort.isOpen){
    serialPort.Open();
}

ところが,このプロパティの戻り値がおかしい.ちゃんと調べてはいないんだけれど,私の環境ではこんな感じ.

  • 他のアプリ(puttyやpoderosa)からシリアルポートを開いているとき→正常
  • 同じアプリ(アプリの多重起動)からシリアルポートを開いているとき→異常

少し調べても結局原因がわからなかったので,例外処理を使って回避することに.

try
{     serialPort.Open();
}
catch {
     ;
}

例外処理をこういう風に使うのってあまり好きじゃないんだけど,とりあえず回避出来たので一安心.