com端口c#被拒绝

时间:2016-04-14 13:40:57

标签: c# serial-port

我一直在为机器编写一些代码。 它必须与RS485通信,我可以使用正常的串行通信,如.net

提供的那样

然而,由于硬件可能会失败,我必须构建测试例程。 所以我编写了重新检测可用组件的例程。 这填补了一个列表&all.93Ports'使用其字符串名称,然后使用nummeric updown根据可用组件的列表索引选择com端口。 (是的,这听起来有点复杂,但出于其他原因,我使用了数字更新来进行选择)。

问题是这个功能只是第一次出现。 如果我再次调用该函数,则会因接缝已打开而拒绝访问。尝试了RS485Port.Close()在不同的地方,但问题是它如果没有打开喷射(鸡蛋问题)就崩溃了。

我打开一个comport的代码是这样的

    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
        }
     }

1 个答案:

答案 0 :(得分: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();
            }