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
}
}
你檢查,如果該端口沒有被另一個進程使用? –
以前它已經被打開了,但是對於測試我不能認爲這個(其他的事情可能已經影響到了機器) ,因爲我不能測試像:'if(RS485Port!= Null)RS485Port。關閉();'我想知道如何解決它 – user3800527
調用Close()不會使端口可用立即。有一個需要退出的工作線程,即生成DataReceived和ErrorReceived事件的線程。需要多長時間是不可預測的。但你肯定可以從例外中知道:)睡一會兒再試一次。不要試圖永遠,因爲它可能實際上是另一個已經聲稱該港口的過程。 –