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";
}
}
}
您的解決方案的工作原理,它不再是拒絕訪問端口,但它仍然凍結。我想出了爲什麼,問題在於「ReadLine」語句,如果沒有可讀的內容,它會卡住。你能幫我找到解決方案嗎?我需要一個重複「ReadLine」語句的循環,但是如果找不到任何東西,那麼它需要繼續循環而不是卡住。 –
根據MSDN:_默認情況下,ReadLine方法將阻塞,直到收到一條線。如果這種行爲不受歡迎,那麼將ReadTimeout屬性設置爲任何非零值,以強制ReadLine方法在端口上沒有可用行的情況下拋出TimeoutException._當然,在那時您會捕獲異常並啓動另一個循環。 – Steve
當我循環while(true){arduino.ReadTimeout = 500; pipe = arduino.ReadLine();}'這個程序可以工作,但是我得到一個超時錯誤彈出窗口。有沒有辦法在不被解釋爲錯誤的情況下使用'ReadTimeout',而是刷新'ReadLine'語句?我不認爲我在正確的地方使用了循環。 –