none
我在.net的serialport类中读取串口数据的时候我捕获到如下的异常:“读串口错误:由于线程退出或应用程序请求,已放弃I/O操作” RRS feed

  • 问题

  • 我在.net的serialport类中读取串口数据的时候我捕获到如下的异常:“读串口错误:由于线程退出或应用程序请求,已放弃I/O操作”
    我的code如下:
    try
                    {
                        sp.Write(message, 0, message.Length);

                    }
                    catch
                    {
                        /// MessageBox.Show("写串口错误: " + e.Message);
                        return false;
                    }
                    System.Threading.Thread.Sleep(300);
                    try
                    {
                        GetResponse(ref response);
                    }
                    catch(Exception er)
                    {
                        MessageBox.Show("读串口错误: " + er.Message);
                        return false;
                    }


    技术无止境!
    2009年7月13日 6:59

答案

全部回复

  • 你好!
         这段代码没有什么可以体现问题本质的信息!
         我估计是你从中获取数据的线程已经结束了!
    周雪峰
    2009年7月13日 7:54
    版主
  • 你好,

    如果你处理SerialPort. DataReceived事件,看看是否可以得到数据

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 heyf 2009年7月16日 10:12
    2009年7月15日 2:32
    版主
  • 你好!
         这段代码没有什么可以体现问题本质的信息!
         我估计是你从中获取数据的线程已经结束了!
    周雪峰
    有什么方法处理这个线程已经结束,而I/O中还有读取数据的队列呢??
    2009年7月27日 4:44
  •             bool flag = false;//是否读完整包数据
                try
                {
                while (this.serialport.BytesToRead >= 0)
                {
                    //如果数据包长度等于13,获取数据长度
                    //if (ReceiveData.Length == 13)
                    //{
                    //    int length = int.Parse(ReceiveData.Substring(4, 2));//数据的长度
                    //    PackgeLength = 3 + 2 + length;//数据包的总长度(字节个数)
                    //}

                    if ((ReceiveData.Length > 0) && (ReceiveData.Length == 13))//如果一整包数据读取完毕
                    {
                        //一包数据已经结束
                        flag = true;
                        break;
                    }
                    //如果没有读取完一整包,则继续读取
                    int data = 0x00;
                
                        data = this.serialport.ReadByte();
                        ReceiveData += (char)data;
                
                    //ReceiveData = ReceiveData.ToUpper();
                }

                if (flag)
                {
                    //safeAddtrText(ReceiveData);//显示数据的委托
                    PrintCommand(ReceiveData);
                    ReceiveData = "";//清空已经接收的数据
                }
                }
                catch
                {
                                }
    把try,catch去掉后也出现这个问问题,不过加上后就解决问题了呵呵。


    fang
    2009年11月26日 2:15