2016-08-21 117 views
0

這是我的情況,當我檢查複選框,我的應用程序凍結,但仍然有效。這意味着它仍然能夠識別通過串口發送的數據;出於測試目的,它只是退出應用程序。冷凍窗口窗體應用程序與複選框c#

如果我註釋掉第45行(「pipe = arduino.ReadLine();」參見下面的截圖),這意味着它不再需要「ReadLine()」,我可以取消選中該框。但是現在,當我嘗試重新檢查該框時,出現錯誤消息"Access to the port 'COM5' is denied"

我認爲代碼無法繼續,因爲它在嘗試「ReadLine()」時尚未發送任何內容。但是我沒有解釋被拒絕訪問COM端口;而不是我試圖打開它已經打開的端口。

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
    { 

     SerialPort arduino = new SerialPort(); 
     arduino.BaudRate = 9600; 
     arduino.PortName = comboBox1.Text; 
     string pipe; 

     if (checkBox1.Checked) 
     { 
      checkBox1.Text = "Listening..."; 
      arduino.Open(); 
       pipe = arduino.ReadLine(); 
       if (pipe == "S\r") 
       { 
        //System.Diagnostics.Process.Start("shutdown", "/f /r /t 0"); 
        System.Windows.Forms.Application.Exit(); 
       } 
     else 
     { 
      checkBox1.Text = "Start"; 
     } 
    } 
} 

回答

0

SerialPort類管理系統資源,當這樣的敏感的物品都參與其中,類通常實現IDisposable接口,以允許立即釋放到系統中的系統資源。

您的代碼忘記關閉SerialPort,因此,下次您的用戶操作導致對此事件處理程序的調用時,您的第一個操作將使用該端口。

幸運的是,以確保正確的關閉和這些對象的處置一個簡單的方法,它是using statement

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 

    if (checkBox1.Checked) 
    { 
     checkBox1.Text = "Listening..."; 
     using(SerialPort arduino = new SerialPort()) 
     { 
      arduino.BaudRate = 9600; 
      arduino.PortName = comboBox1.Text; 
      string pipe; 
      arduino.Open(); 
      pipe = arduino.ReadLine(); 
      if (pipe == "S\r") 
      { 

       //System.Diagnostics.Process.Start("shutdown", "/f /r /t 0"); 
       //System.Windows.Forms.Application.Exit(); 
      } 
     } // Here the port will be closed and disposed. 
    } 
    else 
    { 
     checkBox1.Text = "Start"; 
    } 
} 
+0

您的解決方案的工作原理,它不再是拒絕訪問端口,但它仍然凍結。我想出了爲什麼,問題在於「ReadLine」語句,如果沒有可讀的內容,它會卡住。你能幫我找到解決方案嗎?我需要一個重複「ReadLine」語句的循環,但是如果找不到任何東西,那麼它需要繼續循環而不是卡住。 –

+0

根據MSDN:_默認情況下,ReadLine方法將阻塞,直到收到一條線。如果這種行爲不受歡迎,那麼將ReadTimeout屬性設置爲任何非零值,以強制ReadLine方法在端口上沒有可用行的情況下拋出TimeoutException._當然,在那時您會捕獲異常並啓動另一個循環。 – Steve

+0

當我循環while(true){arduino.ReadTimeout = 500; pipe = arduino.ReadLine();}'這個程序可以工作,但是我得到一個超時錯誤彈出窗口。有沒有辦法在不被解釋爲錯誤的情況下使用'ReadTimeout',而是刷新'ReadLine'語句?我不認爲我在正確的地方使用了循環。 –