一段时间后,SerialPort访问被拒绝

时间:2012-03-17 11:20:21

标签: c# serial-port access-denied .net-micro-framework netduino

我有一个FEZ板(我认为这不重要),我正通过串口与它通信。 我制作了一个WPF应用程序,在那里我打开COM端口并在其上写入数据。 这一切都很好,但是在发送数据后随机发送一次(有时是3次,有时是4次),当我尝试再次发送时,我在端口的Write方法上得到一个异常,说“连接到系统的设备无法正常工作”或尝试在此异常后关闭端口我得到“拒绝访问端口”。当我重新启动程序时,我在Open方法上得到了相同的错误(这是合乎逻辑的)。当我只是断开代表串行链路的USB并重新连接时,我可以再次使用该端口。

这是我的代码:

    SerialPort port = new SerialPort("COM10", 9600);
    public MainWindow()
    {
        InitializeComponent();
        port.Open();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        SendMessage("Relay1On\r\n");
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
        SendMessage("Relay1Off\r\n");
    }

    private void SendMessage(string message)
    {
        try
        {
            port.Write(message);
        }
        catch (Exception exc)
        {
            listbox1.Items.Add(exc.Message);
        }
    }

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        port.Close();
    }

我认为我没有做任何奇怪的事情。 在FEZ板上运行的代码如下:

    private Gadgeteer.Interfaces.DigitalOutput _relay;

    void ProgramStarted()
    {
        try
        {
            usbSerial.Configure(9600, GT.Interfaces.Serial.SerialParity.None, GT.Interfaces.Serial.SerialStopBits.One, 8);
            usbSerial.SerialLine.LineReceivedEventDelimiter = "\r\n";
            usbSerial.SerialLine.AutoReadLineEnabled = true;
            usbSerial.SerialLine.ReadTimeout = GT.Interfaces.Serial.InfiniteTimeout;
            usbSerial.SerialLine.LineReceived += new GT.Interfaces.Serial.LineReceivedEventHandler(SerialLine_LineReceived);
            usbSerial.SerialLine.Open();
            _relay = eBlockExpansion.SetupDigitalOutput(GT.Socket.Pin.Nine, false);
        }
        catch (Exception exc)
        {
            throw exc;
        }
    }

    void SerialLine_LineReceived(GT.Interfaces.Serial sender, string data)
    {
        if (data == "Relay1On")
        {
            _relay.Write(true);
        }
        else if (data == "Relay1Off")
        {
            _relay.Write(false);            
        }
    }

但我觉得这与桌面方面有更多关系。

2 个答案:

答案 0 :(得分:5)

我觉得你的串口问题就好了。 USB非常不可靠,USB串行端口非常不可靠。您可以使用不同的驱动程序改进或将其粘贴到不同的USB端口,获得不同品牌的USB适配器,或者最好用PCI卡替换它。

答案 1 :(得分:1)

听起来像一个片状的USB串行适配器(我认为还有其他任何类型)与.NET的稍微不稳定的SerialPort实现相结合。 .NET真的不能很好地应对突然丢失的串口。

See here

在过去,我已经将所有串口通信转移到一个单独的进程中,这样我就可以杀死它并重新启动它而不会杀死我的其他应用程序。