我正在使用一个窗口应用程序来连续显示文本框上串行端口的数据。以下是我的代码。我运行程序时遇到此错误:
"由于线程退出或应用程序请求,I / O操作已中止。"
我该如何解决这个问题?
private void mainform_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
getWGT();
}
SerialPort port = new SerialPort();
public void getWGT()
{
try
{
port.PortName = "COM1";
port.BaudRate = 9600;
port.StopBits = System.IO.Ports.StopBits.One;
port.DataBits = 8;
port.Parity = System.IO.Ports.Parity.None;
port.Open();
port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public delegate void myDelegate();
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
tWGT.BeginInvoke(new myDelegate(updateTextBox));
}
public void updateTextBox()
{
try
{
tWGT.AppendText(port.ReadExisting());
tWGT.ScrollToCaret();
}
catch {
port.Close();
}
}
答案 0 :(得分:0)
SerialPort
正在线程上使用它自己的Eventloop。当您订阅DataReceived事件时,最好不要在UI线程上读取端口数据。一旦掌握了所有数据,最好将其保留在后台线程和切换上下文中。
我要做的另一个补充是在表单关闭时调用port.Close。在可以处理SerialPort之后。
以下方法已更改为包含我上述的更改:
populateModels()