gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:29:14 36 4
gpt4 key购买 nike

我正在开发一个非常简单的程序(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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com