【问题标题】:SerialPort access denied after a while一段时间后,SerialPort 访问被拒绝
【发布时间】:2012-03-17 11:20:20
【问题描述】:

我有一块 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 Board 上运行的代码如下:

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

但我觉得这更多地与桌面端有关。

【问题讨论】:

  • USB 驱动程序因这种麻烦而臭名昭著。试着找到一个更新,扔掉它,如果没有成功,再试试另一个。
  • @HansPassant:我同意这一点。我从 FTDI (ftdichip.com) 获得了更新的驱动程序,它极大地提高了我的 USB/串行适配器的可靠性。

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


【解决方案1】:

在我看来你的串口有问题。 USB 非常不可靠,USB 串行端口非常不可靠。您可以使用不同的驱动程序或将其插入不同的 USB 端口来改进某些事情,获得​​不同品牌的 USB 适配器,或者最好用 PCI 卡替换它。

【讨论】:

  • 看起来这里的大多数人都是对的,这与驱动程序有关,或者它肯定是 windows 的错误实现,我忘了提到我正在使用 windows 8 PC,我认为串行端口沟通还不是全部。我在 Windows 7 上试过,现在很好用,不再断开串口了
  • 我只使用了基于 FTDI 芯片的 USB 串行转换器,从未遇到任何问题。我想这取决于制造商提供的驱动程序,据我所知,FTDI 提供了非常好的驱动程序。如果他们签约,那就更好了。这是一个认真对待司机的人的一个很好的例子,这就是为什么 MS 让你自己签名甚至很难通过 WHQL。
【解决方案2】:

听起来像是一个不稳定的 USB 串行适配器(我认为没有其他类型的适配器),再加上 .NET 的稍微不稳定的 SerialPort 实现。 .NET 确实不能很好地应对突然丢失串行端口的情况。

See here

在过去,我已经将所有串行端口通信放到一个单独的进程中,这样我就能够杀死它并重新启动它,而不会杀死我的应用程序的其余部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2017-06-29
    • 2010-11-19
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    相关资源
    最近更新 更多