"由于线程退出或应用程序请求,I / O操作已中止"在断开串口

时间:2015-12-19 10:22:38

标签: c# exception exception-handling serial-port

我正在编写一个程序来从串行读取数据并显示它。当我断开与The I/O operation has been aborted because of either a thread exit or an application request异常的串行时,有时(不是每次都)崩溃。 (我猜这里有些不对劲,即使不是每次都发生。)

以下是我如何阅读连续剧:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // this line below is where the exception is
    string read = _serialPort.ReadLine().Replace(".", ",").Split('\r')[0];
}

// clicking on a button opens/closes serial
private void button1_Click(object sender, EventArgs e)
{
    if (isSerialConnected)
        disconnectSerial();
    else
        connectSerial();
}

public void connectSerial()
{
    _serialPort.PortName = serialCombobox.SelectedItem.ToString();
    _serialPort.BaudRate = 9600;
    _serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);
    _serialPort.Open();

    serialCombobox.Enabled = false;
    connectSerialButton.Text = "disconnect";

    isSerialConnected = true;
}

public void disconnectSerial()
{
   _serialPort.Close();

    serialCombobox.Enabled = true;
    connectSerialButton.Text = "connect";

    isSerialConnected = false;
}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您从事件处理程序中的串行端口读取数据。来自SerialPort.ReadLine()

  

默认情况下,ReadLine方法将阻塞,直到收到一行。

因此,当您关闭串行端口时,您可能仍在等待接收线路。但是如果端口关闭则无法接收数据,因此抛出异常,因为无法再接收一行。

答案 1 :(得分:1)

我已经用这种方式改变了,现在这种方式有效。

try
{
    read = _serialPort.ReadLine().Replace(".", ",").Split('\r')[0];
}
catch (System.IO.IOException error)
{
    return;
}
catch (System.InvalidOperationException error)
{
    return;
}

发生了两种错误,IOException带有问题标题上的消息,InvalidOperationException带有消息"端口已关闭"。在这两种情况下,我们都会返回而不处理数据。

我不确定这是应该做的方式,但无论如何,它有点有效。