在的SerialPort扔WPF I / O异常

我是一个非常简单的程序(在VS2010 C#WPF应用程序)从上的SerialPort一个TextBox的显示数据和显示工作。 该项目在正常情况下正常工作。 但是,当用户打开一个连接,收集一些数据,关闭它,然后再次打开它,几个周期做到这一点,该方案最终将抛出一个异常:

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

有时,该计划将我扔异常; 有时候程序只是挂起。 下面是我的代码:

/* 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小时,这导致没有取得进展:

  1. 我曾尝试添加Thread.Sleep(3000)前后Open()Close() 我开始变得很沮丧,我把Thread.Sleep在每一个线之间。 不过,我觉得这将足够的时间在后台一些未完成的工作。 不解决问题。
  2. 我想扎克锯的帖子。 很多留在博客文章评论都是非常积极的。 我想尽了办法,甚至复制和精确的代码粘贴到我的。 不解决问题。 很长的职位,浪费了我半天。
  3. 金汉密尔顿在这里讨论的问题。 它建议使用BeginInvoke ,而不是Invoke 。 尝试和仍然存在同样的问题。
  4. 有一个非常好的商业的SerialPort库Franson SerialTools这是相当便宜,不管有多少时间和有多快我打开()或关闭()的的SerialPort与没有错误的工作太棒了。 但是,他们有中断他们的发展,他们有库仅适用于窗体应用程序,而不是WPF。 他们的一些他们的API中的说法只接受Forms.Control。 太糟糕了。 还有其他商业产品在那里,但他们要么过于售价或不提供免费试用,所以我不知道它是否有效与否购买前

有谁拿到.NET的SerialPort工作和实际检查的bug(open()和关闭()多次 - 即使当没有输入数据)?

--------------解决方案-------------

当您打开端口添加事件处理程序,关闭时,我想你应该将其删除。

试着这样做:

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

希望这会解决问题。

我想象中的阻塞调用ReadLine是通过调用中断Close从UI线程。 这有什么错赶上这个错误? 我希望它发生。

分类:C# 时间:2015-03-16 人气:11
本文关键词: WPF,串口
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.843 (s). 10 q(s)