2016-08-01 7 views
0

Visual Studioを使用してC#で私の初めてのプログラムを作成しています。使用可能なCOMポートがドロップダウンメニューに表示されます。これらの「利用可能な」ポートの1つがプログラムの外で開かれていないかどうかを確認するにはどうすればよいですか?VS C#List Available(未使用)シリアルポート

foreach (string portName in System.IO.Ports.SerialPort.GetPortNames()) 
    { 
     serialPort1.PortName = portName; 
     if (serialPort1.IsOpen == false) // Only list if it is not in use - does not work - .IsOpen is only valid from within this app 
     { 
      CommsBox.Items.Add(portName); 
     } 
    } 

私はこれを行うことを望んだが、うまくいかない。

+3

このようなコードは、マルチタスクオペレーティングシステムでは決して確実に動作しません。あなたはOpen()を呼び出すまで見つけることができません。あなたはクリスタルクリアな例外を得るでしょう。 –

答えて

0

serialPort1を初期化するときは、

あなたはSerialPortの新しいインスタンスを作成し、それがこのような無料だかどうかを知るためにそれを開く必要があります。

foreach (string portName in System.IO.Ports.SerialPort.GetPortNames()) 
    { 
     try{ 
      SerialPort serialPort1 = new SerialPort(); 
      serialPort1.PortName = portName; 
      serialPort1.Open(); 
      CommsBox.Items.Add(portName); //If you can open it it's because it was free, so we can add it to available 
      serialPort1.Close(); //Should close it again 
      } 
     catch (Exception ex){ 
      //manage the exception... 
     } 
    } 

More information about 'SerialPort' class

EDIT:

最善の解決策は以下の通りです@バッドダックのコメント:

"ハンス・パッサントは最高だと言っています。マルチタスクオペレーティングシステムでは決して確実に動作しません。あなたはOpen()を呼び出すまで見つけることができません。 COMポートが使用中の場合、例外がスローされますが、あなたはそれを処理することができます。あなたはしてください。

+0

なぜこの回答が下降したのですか?理にかなっていますが、実際にはシリアルポートを開いて他の場所で使用されているかどうかを確認するよりも良い方法があると思っていました。 – AJBotha

+0

これは、実際には、私がSerialPortを使用できるかどうかをテストするために知っている唯一の方法です。誰かが他の最適なソリューションを提供してくれれば私は警戒するでしょう:) – Raskayu

+0

私はdownvoteしませんでしたが、実際には利用可能なシリアルポートのリスト全体を見て、それらをすべて閉じて閉じるのは良いアイデアではありません。すべてのポートを知っているマシンとそれぞれのポートが分かっているマシンで何らかの開発をしているのであれば、大丈夫かもしれませんが、環境を知らない誰かのPCで使うには、これは一般的に悪い練習。 – Baddack

関連する問題