2012-08-09 90 views
1

另一端的設備突然斷開連接後,我無法重新連接到COM端口。 只有關閉並重新打開應用程序,我才能再次連接。丟失連接後重新連接到COM

這裏是我的連接功能:

public bool connectTurboPump() 
    { 
     try 
     { 
      if (TPumpSerialPort != null && TPumpSerialPort.IsOpen == true) 
       return true; 

      DataRow dr = tblTPump.Rows[0]; 

      Types.Connection TPumpConnection = new Types.Connection(); 
      TPumpConnection.PORT = dr["port"].ToString(); 
      TPumpConnection.BAUD_RATE = Convert.ToInt32(dr["baud"]); 
      TPumpConnection.PARITY = (Parity)Enum.Parse(typeof(Parity), dr["parity"].ToString(), true); 
      TPumpConnection.DATA_BITS = Convert.ToInt32(dr["dataBits"]); 
      TPumpConnection.STOP_BITS = (StopBits)Enum.Parse(typeof(StopBits), dr["stopBits"].ToString(), true); 
      TPumpConnection.HANDSHAKE = (Handshake)Enum.Parse(typeof(Handshake), dr["handshake"].ToString(), true); 

      TPumpSerialPort = new SerialPort(TPumpConnection.PORT, TPumpConnection.BAUD_RATE, TPumpConnection.PARITY, TPumpConnection.DATA_BITS, TPumpConnection.STOP_BITS); 
      TPumpSerialPort.Handshake = TPumpConnection.HANDSHAKE; 
      TPumpSerialPort.Open(); 
      TPumpSerialPort.NewLine = "\r"; 
      TPumpSerialPort.ReadTimeout = 10000; 
      TPumpSerialPort.WriteTimeout = 10000; 

      if (TPumpSerialPort.IsOpen != true) 
       return false; 

      return true; 
     } 
     catch { return false; } 
    } 

這裏是我重新連接功能:

public bool reconnectTurboPump(int attempts = 3) 
    { 
     try 
     { 
      if (TPumpSerialPort != null && TPumpSerialPort.IsOpen == true) 
      { 
       TPumpSerialPort.Close(); 
       TPumpSerialPort.Dispose(); 
      } 

      int i = 1; 
      while (true) 
      { 
       Log(string.Format("Reconnecting Turbo Pump attempt {0}", i)); 

       if (connectTurboPump()) 
        break; 

       if (i == attempts) 
        return false; 

       i++; 
      } 

      return true; 
     } 
     catch (Exception ex) 
     { 
      Log(string.Format("Could not reconnect to Turbo Pump: {0}", ex.Message)); 
      return false; 
     } 
    } 

真的很感激,如果有人可以幫助。

謝謝。

+1

請看看這個鏈接:http://stackoverflow.com/questions/4369679/com-port-is-denied。我想你會找到幾個適用的建議。 – paulsm4 2012-08-09 19:59:44

+0

如果將if(TPumpSerialPort!= null && TPumpSerialPort.IsOpen == true)'改爲'if(TPumpSerialPort!= null)',會發生什麼? – 2012-08-09 20:06:48

+0

經過評估10+串口解決方案後,我只找到一個工作。你可以在這裏看到我的答案詳細信息:http://stackoverflow.com/a/8003897/362536我不知道這個問題是否適用於你,但如果是這樣,我建議檢查CommStudio。 – Brad 2012-08-09 20:07:03

回答

0

按照托馬斯的建議,我已將重新連接腳本更改爲以下內容。現在正在測試中。

public bool reconnectTurboPump(int attempts = 3) 
    { 
     try 
     { 
      //if (TPumpSerialPort != null && TPumpSerialPort.IsOpen == true) 
      if (TPumpSerialPort != null) 
      { 
       TPumpSerialPort.Close(); 
       TPumpSerialPort.Dispose(); 
      } 

      int i = 1; 
      while (true) 
      { 
       Log(string.Format("Reconnecting Turbo Pump attempt {0}", i)); 

       Thread.Sleep(2000); 

       if (connectTurboPump()) 
        break; 

       if (i == attempts) 
        return false; 

       i++; 
      } 

      return true; 
     } 
     catch (Exception ex) 
     { 
      Log(string.Format("Could not reconnect to Turbo Pump: {0}", ex.Message)); 
      return false; 
     } 
    } 
1

如果這是一個真正的串口連接,這沒什麼意義。沒有「連接」狀態,串行端口是非常簡單的設備,沒有建立連接的底層協議。

如果這實際上是一個USB設備,模擬串行端口,那麼你確實會遇到這種問題。模擬串行端口的驅動程序在端口正在使用時拔出USB連接器時總會變得非常噁心。實際上有的USB設備連接協議,協商是由驅動程序完成的。它們通常使端口消失,這往往會給用戶代碼一個無法恢復的心臟病發作。行爲非常不可預測,因司機而異。沒有辦法解決這個問題,將連接器粘貼到端口上,並且不要假設拔出它可以解決代碼中的任何問題,即使這是您使用USB可以做的唯一的事情。

+0

+1這聽起來對我來說很合適。我認爲評論中的@ paulm4鏈接聽起來像是一種撩撥USB驅動程序的方式。 http://stackoverflow.com/questions/4369679/com-port-is-denied – kenny 2012-08-10 12:53:27

+0

在我的情況下,這是直接RS232連接,沒有任何適配器。 – 2012-08-11 20:04:16

+0

然後我的第一段適用。切勿在關閉後立即調用SerialPort.Open。它不起作用,工作線程需要關閉,並且需要不可預測的時間。沒有意義。我無法以其他方式查看connectTurboPump()可能執行的操作。 – 2012-08-11 20:12:58

相關問題