c# - WPF 中的 SerialPort 抛出 I/O 异常

标签 c# wpf serial-port

我正在开发一个非常简单的程序(VS2010 中的 C# WPF 应用程序),它显示来自 SerialPort 的数据并显示在 TextBox 上。该程序在正常情况下运行良好。但是当用户打开一个连接,收集一些数据,关闭它,再打开它,如此循环数次,程序最终会抛出异常:

“由于线程退出或应用程序请求,I/O 操作已中止。” [ReadLine()发生I/O异常]

有时程序会抛出异常;有时程序只是挂起。 下面是我的代码:

/* Click to Open ComPort */
private void PortOpen_Click(object sender, RoutedEventArgs e)
{
    if (!serialPort1.IsOpen)
    {
        serialPort1.PortName = "COM1";
        serialPort1.BaudRate = 9600;
        serialPort1.ReceivedBytesThreshold = 1;
        serialPort1.NewLine = "\r\n";
        serialPort1.Parity = Parity.None;
        serialPort1.StopBits = StopBits.One;
        serialPort1.DataBits = 8;
        serialPort1.Handshake = Handshake.None;

        serialPort1.Open();

        serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Receive);
    }
}

/* Receive data from ComPort */
private void Receive(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    if (serialPort1.IsOpen)
    {
        try
        {
            string1 = serialPort1.ReadLine(); /* This is where I/O Exception occurred */
            Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), string1);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}

private void DisplayText(string string1)
{
    textBox1.Text = string1;
}
/* Close ComPort */
private void PortClose_Click(object sender, RoutedEventArgs e)
{
    if (serialPort1.IsOpen)
    {
        serialPort1.Close();
    }            
}

以下总结了我在过去 40 小时内尝试用头撞 table 但没有取得任何进展:

  1. 我尝试在 Open()Close() 之前和之后添加 Thread.Sleep(3000)。我开始感到非常沮丧,以至于我将 Thread.Sleep 放在每一行之间。我虽然这样可以留出足够的时间在后台进行一些未完成的工作。不能解决问题。
  2. 我试过了 Zach Saw's Post .博客文章中留下的很多评论都非常积极。我尝试了这种方法,甚至将确切的代码复制并粘贴到我的代码中。不解决问题。一篇很长的帖子,浪费了我半天的时间。
  3. Kim Hamilton 解决问题 here .这建议使用 BeginInvoke 而不是 Invoke。尝试过但仍然存在同样的问题。
  4. 有一个非常好的商业 SerialPort 库 Franson SerialTools这是相当便宜的,而且无论我打开()或关闭()串行端口多少次和多快,都没有错误,效果非常好。但是,他们已经停止开发,并且他们拥有的库仅适用于 Form 应用程序,不适用于 WPF。他们在 API 中的一些参数只接受 Forms.Control。太糟糕了。还有其他商业产品,但要么价格过高,要么不提供免费试用,所以我在购买前不知道它是否有效

是否有人让 .NET SerialPort 工作并实际检查错误(Open() 和 Close() 多次 - 即使没有传入数据)?

最佳答案

当你打开端口时你添加了事件处理程序,当关闭时我认为你应该删除它。

尝试这样做:

private void PortClose_Click(object sender, RoutedEventArgs e)
{
    if (serialPort1.IsOpen)
    {
        serialPort1.DataReceived -= Receive;
        serialPort1.Close();
    }            
}

希望这能解决问题。

关于c# - WPF 中的 SerialPort 抛出 I/O 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6452330/

相关文章:

c# - "the process cannot access the file because it is being used by another process"试图删除文件时

c# - 创建方法可以访问类似的命名字段,但没有继承的不同类型的对象

c# - 如何避免复制/粘贴许多事件处理程序

c# - 丰富的卡片属性 Markdown 格式化

c# - 如何将控件的属性值传递给 WPF 中同一控件的 "CommandParameter"属性

javascript - 从 NodeJS 控制 Arduino

batch-file - PuTTY 命令行自动执行来自文件的串行命令

c# - 获取被点击的菜单项的文本?

c# - 存储连接字符串

JAVA读写COM口