由于线程退出或应用程序请求,I / O操作已中止 [英] The I/O operation has been aborted because of either a thread exit or an application request

查看:372
本文介绍了由于线程退出或应用程序请求,I / O操作已中止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

该项目的座右铭是建立一个测试设置来检查数据发送和放大。接收不同的串口设置,如波特率,数据位,奇偶校验等。当串口波特率改变并执行时,读/写数据时会出现上述错误。有时在访问串行端口属性时会发生错误。

使用2个串行端口对象创建示例应用程序,假设com1& COM7。数据从Com1发送到Com7。我有一个线程,它接收com7中的数据并将其发送回Com1。使用另一个线程,读取com1中的数据并写入文件。代码如下:

The motto for the project is to extablish a test setup to check data send & receive with different serial port settings such as baud rate, data bits, parity etc. When the serial port baud rate is changed and executed, the above error occurs during reading/writing data. Some times the error occurs when accessing serial port properties.
Sample application is created with 2 serial port objects, assume com1 & com7. Data is sent from Com1 to Com7. I have a thread that recieves the data in com7 and sends it back to Com1. Using another thread, data from com1 is read and write to file. Code is attached below.

private void Form2_Load(object sender, EventArgs e)
{
  sp.BaudRate = 9600;
  sp.DataBits = 8;
  sp.StopBits = StopBits.One;
  sp.Handshake = Handshake.None;
  sp.Parity = Parity.None;
  sp.PortName = "COM7";
  sp.Open();
  sp1.BaudRate = 9600;
  sp1.DataBits = 8;
  sp1.StopBits = StopBits.One;
  sp1.Handshake = Handshake.None;
  sp1.Parity = Parity.None;
  sp1.PortName = "COM1";
  sp1.Open();

  rxThread = new Thread(new ThreadStart(ReceiveBytes));
  rxThread.SetApartmentState(ApartmentState.STA);
  rxThread.Name = "Serial Receive Message Thread";
  rxThread.Start();
  rxThread1 = new Thread(new ThreadStart(ReceiveBytes1));
  rxThread1.SetApartmentState(ApartmentState.STA);
  rxThread1.Name = "Serial Receive Message Thread";
  rxThread1.Start();
  _SyncObj = new object();
}
private void ReceiveBytes1()
{
  try
  {
    sw1 = new StreamWriter("C:\\sample1.txt", true);
    while (true)
    {
      if (bAbort)
        break;
      if (sp != null)
      {
        while (sp.IsOpen && sp.BytesToRead > 0 && sp.BreakState == false)
        {
          if (sp.IsOpen)
          {
            String res = sp.ReadExisting();
            sb.Append(res);
            //sw1.Write(res);
          }
        }
      }
    }
  }
  catch (Exception ex)
  {
    string r = ex.Message;
  }
}
private void ReceiveBytes()
{
  try
  {
    while (true)
    {
      if (bAbort)
        break;
      if (sp1 != null)
      {
        while (sp1.IsOpen && sp1.BytesToRead > 0 && sp1.BreakState == false) // Read Bytes, if available from port
        {
          if (sp1.IsOpen)
          {
            //string res = sp1.ReadExisting();
            //lock (_SyncObj)
            //{
            int res = sp1.ReadByte();
            if (sp1.BreakState == false)
              sp1.Write(new Byte[] { (Byte)res }, 0, 1);
            //}
          }
        }
      }
    }
  }
  catch (Exception ex)
  {
    string r = ex.Message;
  }
}
public void ClearSerialPort()
{
  try
  {
    sp.BreakState = true;
    Thread.Sleep(2400);
    while (sp.BytesToRead > 0)
      sp.DiscardInBuffer();
    while (sp.BytesToWrite > 0)
      sp.DiscardOutBuffer();
  }
  catch (Exception e)
  {
    string err = e.Message;
  }
}
public void ClearSerialPort1()
{
  try
  {
    sp1.BreakState = true;
    Thread.Sleep(2400);
    while (sp1.BytesToRead > 0)
      sp1.DiscardInBuffer();
    while (sp1.BytesToWrite > 0)
      sp1.DiscardOutBuffer();
  }
  catch (Exception e)
  {
    string err = e.Message;
  }
}
private void button1_Click(object sender, EventArgs e)
{
  for (int i = 1; i < 6; i++)
  {
    // Attempt 1
    String hexData = GetHexStringFromFile("C:\\Documents and Settings\\ravikr0\\Desktop\\test\\testfiles_1019\\test_1Kb.txt");
    Char[] data = GetCharArrayfromString(hexData);
    SendData(data);
    ClearSerialPort();
    ClearSerialPort1();
    sp1.BaudRate = 1200;
    sp.BaudRate = 1200;
    sp.BreakState = false;
    sp1.BreakState = false;
    // Attempt 2
    hexData = "12345678901234567890";
    data = GetCharArrayfromString(hexData);
    SendData(data);
    ClearSerialPort();
    ClearSerialPort1();
    sp1.BaudRate = 2400;
    sp.BaudRate = 2400;
    sp.BreakState = false;
    sp1.BreakState = false;
    // Attempt 3
    hexData = GetHexStringFromFile("C:\\Documents and Settings\\ravikr0\\Desktop\\test\\testfiles_1019\\test_1Kb.txt");
    data = GetCharArrayfromString(hexData);
    SendData(data);
    ClearSerialPort();
    ClearSerialPort1();
    sp1.BaudRate = 4800;
    sp.BaudRate = 4800;
    sp.BreakState = false;
    sp1.BreakState = false;
    // Attempt 4
    hexData = GetHexStringFromFile("C:\\Documents and Settings\\ravikr0\\Desktop\\test\\testfiles_1019\\test_1Kb.txt");
    data = GetCharArrayfromString(hexData);
    SendData(data);
    ClearSerialPort();
    ClearSerialPort1();
    sp1.BaudRate = 9600;
    sp.BaudRate = 9600;
    sp.BreakState = false;
    sp1.BreakState = false;
    // Attempt 2
    hexData = GetHexStringFromFile("C:\\Documents and Settings\\ravikr0\\Desktop\\test\\testfiles_1019\\test_1Kb.txt");
    data = GetCharArrayfromString(hexData);
    SendData(data);
  }
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
  bAbort = true;
  if (rxThread != null)
    rxThread.Join(1000);
  if (sw != null)
    sw.Close();
  if (rxThread1 != null)
    rxThread1.Join(1000);
  if (sw1 != null)
    sw1.Close();
}
public void SendData(Char[] data)
{
  try
  {
    sp.Write(data, 0, data.GetLength(0));
  }
  catch (Exception ex)
  {
    String err = ex.Message;
  }
}



请提供有关如何克服此错误的建议。


Please provide me suggestions on how to overcome from this error.

推荐答案

首先你需要关闭你的端口,然后改变波特率!

first of all you need to close your port then change baud rate !
Char[] data = GetCharArrayfromString(hexData);
     SendData(data);
     ClearSerialPort();
     ClearSerialPort1();
////// here the code must be added
     sp1.close();
////// here the code must be added
     sp1.BaudRate = 1200;
     sp.BaudRate = 1200;
     sp.BreakState = false;
     sp1.BreakState = false;





then



then

sp1.open()

必须在传输开始时再次使用,所以请使用

must use again in the beginning of your transmission so please check port status using

sp1.IsOpen

获取端口状态的属性。



另一个问题是由于你的线程,因为串口连接到线程。所以在更改串口属性时你会遇到问题。

property for getting port status.

the other issue is due to your thread because and the serial port is attached to the thread. so you will be face problem when changing serial port property.


这篇关于由于线程退出或应用程序请求,I / O操作已中止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆