2016-04-14 16 views
2

私は機械用のコードをいくつか書いています。 RS485と話をしなければなりません。提供されているように、通常のシリアル通信を使用できます。COMポートでのアクセスが拒否されました。#

しかし、ハードウェアが故障する可能性があるため、テストルーチンをビルドする必要があります。 だから私は、利用可能なcomportsを再検出するルーチンを書いた。 これは、リスト 'allComPorts'に文字列名を入力し、nummeric upownを使用して、使用可能なcomportsのリストインデックスに基づいてcomポートを選択します。 (はい、これは少し複雑に聞こえますが、他の理由で私は選択のための数値のアップダウンを使用していました)。

問題は、この機能が最初に初めて起動することです。 私は関数をもう一度呼び出すと、すでに開いている継ぎ目としてアクセスが拒否されます。さまざまな場所でRS485Port.Close()を試みましたが、ジェット(鶏卵の問題)が開かれていないと、問題がクラッシュします。コンポートを開くために

私のコードは、私がこれのルックス好まないこの

private void RS485Activate() 
    { 
      lblNoRS485Communication.Visible = false; 
     if (cmbRS485Port.Value != 0) // if 0 then there are no serial ports 
     { 
      //rs485Port is a global declared as > System.IO.Ports.SerialPort RS485Port; 
      RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]); 
      if (!RS485Port.IsOpen) 
      { 
       // RS485Port.Close(); 
       // RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]); 
       RS485Port.BaudRate = 9600; 
       RS485Port.Parity = System.IO.Ports.Parity.None;     
       RS485Port.StopBits = System.IO.Ports.StopBits.One;    
       RS485Port.DataBits = 8;           
       RS485Port.Handshake = System.IO.Ports.Handshake.None;   
       RS485Port.RtsEnable = true; 
       RS485Port.Open(); <== it crashes here with access denied 
      } 
     } 
     else 
     { 
      MessageBox.Show("There is no COM port detected, the program will work but it cannot control any machinery", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
      lblNoRS485Communication.Visible = true; // another warning 
     } 
    } 
+0

あなたがチェックした? –

+0

同じルーチンでこれまでに開かれていたのですが、テストのために私はこれを仮定することができません()ので、私のようなテストはできません: 'if(RS485Port!= Null)RS485Port。 close(); 'それを解決する方法が不思議です – user3800527

+0

Close()を呼び出すと、ポートが使用可能になりませんすぐに。終了する必要があるワーカースレッドは、DataReceivedイベントとErrorReceivedイベントを生成するものです。それがどれくらいの時間を要するかは予測できません。しかし、あなたは確かに例外から伝えることができます:)しばらくの間スリープして、もう一度やり直してください。それはすでにポートを主張している別のプロセスかもしれないので、永遠に試してはいけません。 –

答えて

0

ように書きますので、私はより良い方法があると願っています。 しかし、回避策としてtryキャッチ構造を使用しています。これは最初に閉じようとしました(try-catchはまだ初期化されていなければclose()エラーから保護します)ポートが別のプロセスによって使用されていない場合の解決策歓迎され、私は。コードは予想しなければならないとエラーに基づくものではないと思う(またはことは、.NETで、これらの日okです?)

  //...     
      try 
      { RS485Port.Close(); } 
      catch 
      { } 
      RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]); 
      if (!RS485Port.IsOpen) 
      { 
       // RS485Port.Close(); 
       // RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]); 
       RS485Port.BaudRate = 9600; 
       RS485Port.Parity = System.IO.Ports.Parity.None;   
       RS485Port.StopBits = System.IO.Ports.StopBits.One;  
       RS485Port.DataBits = 8;          
       RS485Port.Handshake = System.IO.Ports.Handshake.None;  
       RS485Port.RtsEnable = true; 
       RS485Port.Open(); 
      } 
関連する問題