2016-04-14 159 views
2

我一直在爲機器編寫一些代碼。 它必須說RS485,我可以使用正常的串行通信爲它提供.net在com端口c上拒絕訪問#

但是,由於硬件可能會失敗,我必須建立測試例程。 所以我寫了重新檢測可用comports的例程。 使用它們的字符串名稱填充列表'allComPorts',然後使用數字上下按鈕選擇基於其可用comports的列表索引的com端口。 (是的,這聽起來有點複雜,但由於其他原因,我已經使用數字更新選擇)。

問題是這個函數只有第一次。 如果我再次調用該函數,我會得到一個拒絕訪問,因爲它的接縫已經打開。嘗試RS485Port.Close()在不同的地方,但如果它沒有打開jet(雞蛋問題),問題就會變成崩潰。

我的代碼打開一個水果盤是這樣

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。關閉();'我想知道如何解決它 – user3800527

+0

調用Close()不會使端口可用立即。有一個需要退出的工作線程,即生成DataReceived和ErrorReceived事件的線程。需要多長時間是不可預測的。但你肯定可以從例外中知道:)睡一會兒再試一次。不要試圖永遠,因爲它可能實際上是另一個已經聲稱該港口的過程。 –

回答

0

我不喜歡這個長相,所以我希望有一個更好的辦法。 但是作爲一種解決方法,使用try catch結構,它現在首先嚐試關閉,(try-catch可以防止close()錯誤,如果它還沒有初始化,那麼我不喜歡這個解決方法,所以更好解決方案是值得歡迎的,我不認爲代碼應該預見並基於錯誤。(或者是確定這些天.NET?)

  //...     
      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(); 
      }