2013-07-11 26 views
5

最近、SerialPortクラスを使っています。現在、アプリケーションが使用する通信ポートにデバイスが接続されているかどうかを確認する適切な方法を見つけようとしています。デバイスが通信ポートに接続されているかどうかを確認する適切な方法はありますか?私の現在の方法は以下の通りです:C#シリアルポートデバイスが接続されているかどうかをチェック

  while (isReading == true) 
      { 
       try 
       { 
        received += serialPort.ReadExisting(); 

        if (received.Contains('>')) 
         isReading = false; 
       } 
       catch (Exception e) 
       { 

       } 
       if (tick == 10000) 
        if (received == "") 
        { 
         Console.WriteLine("No Data Received. Device isn't connected."); 
         isReading = false; 
        } 
       tick++; 
      } 
      Console.WriteLine(received); 

それは動作しますが、私はそれが少しハッキーと信頼できないと感じています。私はそれが必要な場合はそれを保つことができますが、これを行うための適切な選択肢があれば、私はそれが欲しいです。

編集:実際には信頼できるように、ティック値を約10,000に設定する必要があります。それ以外の場合は、データを受信できません。 1000または5000に設定することさえ信頼性がありません。それでも、複数のマシン間で信頼性が保証されているわけではありません。

+0

を要約するためにあなたが同様にデバイスをプログラミングしていますか? – Rubixus

+0

@Rubixus No. Fluke 5500Aマルチプロダクトキャリブレータと呼ばれる医療機器です。私はそれ自身で内部設定を変更するつもりはありません。 – DanteTheEgregore

+0

接続時にデバイスがレジストリにドライバを登録しますか?それはUSBデバイスですか? – Kcvin

答えて

7

私はあまりにもシリアルポートで作業する必要があり、彼らは痛みであると信じています。 デバイスが接続されているかどうかを確認する私の方法は、通常、ポーリングコマンドの発行を中心に行われます。 メソッドがうまくいくかもしれませんが、私は助けられませんが、イベントが十分であるときにwhileループを使用するのは嫌です。通常、私は、デバイスが接続されていることを確認するために指定された間隔でポーリングコマンドを発行し

Serial.DataReceivedSerial.ErrorReceivedSerial.Write

.NETシリアルポートクラスは、いくつかの有用なイベントを提供しています。 デバイスが応答すると、DataReceivedイベントが発生し、それに応じて(他の必要なデータとともに)対応することができます。これは、シンプルなタイマーまたはインクリメントされた変数と組み合わせて使用​​して、応答時間を計ることができます。注意:ReadTimeoutWriteTimeoutの値を適切に設定する必要があります。これは、ReadExistingおよび/またはReadLineメソッドと共に、DataReceivedイベントハンドラで使用できます。だから、

、(擬似コードで)、

Send Polling command, Start Timer 
Timer to CountDown for a specified time 
If Timer fires, then assume no response 
If DataRecieved fires (and expected response) assume connection 
(of course handle any specific Exceptions (e.g TimeOutException, InvalidOperationException) 
0

どのデバイスも接続して '>'を送信できるので、これはハッキーです。それはあなたのデバイスを意味するものではありません。

代わりに、SerialPort.GetPortNamesWMI Queriesのようなものを使用して、COMポートに接続されたデバイスを調べるようにしてください。

thisの例を出発点として使用できます。

ドキュメントと例を読んだ後、コンピュータ上のドライバとその接続されたCOMポートを登録するすべてのデバイス情報のリストを作成できるはずです。

編集:デバイスが自身を登録しないため

、あなたの仕事は非常に簡単になるかもしれないのVisual Studio用product driversを見て検討してください。

+0

'>'コマンドが発行され、すべてがバッファに書き込まれたことを示すトークン文字だけです。デバイスが接続されているかどうかを確認する私の現在の方法は、設定された時間だけ待機し、受信した場合に空の文字列以外のものが含まれているかどうかを確認することです。問題は、良いコンピュータでは、データが受信される前にティック値が10,000倍に増加する可能性があるということです。私が簡単に頼りにできるものではありません。 – DanteTheEgregore

+0

この方法は、OPが指定したものであるRS232ではなく、USBシリアルデバイスでのみ機能します。 – Rubixus

+0

@Rubixusこれは私が与えた例です。ドライバがインストールされているデバイスでWMIクエリを使用できます。ドライバがインストールされると、デバイスマネージャに表示されます。あなたのデバイスマネージャー内にあれば、WMIクエリを使って見つけることができます。あなたのコメントも無効です。 – Kcvin

2

シリアルポートでは、特定のデバイスが接続されているかどうかを判断する適切な方法はありません。あなたのデバイスだけが正しく応答する魔法のメッセージを書くことができますが、this answerに記載されているように、この方法は他の接続されたデバイスに問題を引き起こす可能性があります。

最終的には、ユーザーが正しいポートを選択している必要があります。

また、デバイスへの接続が失われた場合は、読み書きに失敗したときしかわかりません。この場合、LostConnectionイベントをスローするだけです。

+0

デバイスにドライバがある場合、私の答えに記されているように、WMIクエリを使用してデバイスを識別できます。この答えは誤解を招きます。ドライバがない場合は、ドライバを作成し、自分で書き留め、デバイスを検出する方法を学ぶことができます。 – Kcvin

+0

@NETscape RS232デバイスの場合、WMIクエリは機能しません。 – Rubixus

+1

@NETscape答えが誤解を招くとは思わない。彼は大きなポイントを作る。シリアル接続は非常にうまくいきます。彼らは仕事をするのがむしろ難しいかもしれません。ドライバは本当にオプションではありません。 – DanteTheEgregore

関連する問題