我作了一个程序不停的从串口读取数据。
但是在关闭窗体的时侯,发生了问题。
我用一个按钮关闭窗体就会发生程序停止响应的情况。应该怎么办呀?                ifread = false;
                
                serialPort1.Close();
                serialPort2.Close();
我在每个datareceived 事件里都加了一个bool量来控制是否读取串口数据。但是在关闭串口的时侯还是出问题。该怎么办呀?

解决方案 »

  1.   

    你在代码里加上,try{}catch{},看看程序报的什么异常。
      

  2.   


     if (mycomm.IsOpen)
                {
                    mycomm.Close();
                    Dispose();//清除资源
                    richTextBox1.Text += "断开端口成功\n";
                 
                   // MessageBox.Show("断开端口成功");
                }个人愚见
    最好做个监听   http://blog.csdn.net/wuyazhe/article/details/5606276
      

  3.   

    我试了加try {} 和catch{};还有关闭后dispose();都没有反应。
    我如果用一个按钮,先把ifread 这个控制datarecived事件里读取数据的的变量设成false 然后在formclosing 事件里关闭串口,就不会出现程序没有响应的情况了。各人反析就是我在执行关闭串口的时侯,一定有串口的线程在执行读取串口,所以就造成了不能关闭串口而我用一个按钮先把ifread设成false则即使触发了datarecived事件也不会读从串口读取数据了,这时侯我在用手点关闭窗体的时侯触发formclosing事件里执行serialport1.close();就不会出现程序停止响应的情况了(这里有一个时间差)。 但是我的问题是这样我就闭需先按一个按钮执行ifread=false;然后在执行关闭窗体和串口命令。
    太麻烦了。我试了用
    ifread = false ;
    thread.sleep(1000);
    serialport1.close();来制造这个时间差,可试没有用。求达人帮助。
      

  4.   

    我按照2楼给的链接成下面这样,还是关闭不上串口呀? 
    public void read1(object sender, SerialDataReceivedEventArgs e)
            {
                if (ifread == false) return;
                try
                {
                    if (ifread)
                    {
                        listening = true;
                        int y = serialPort2.BytesToRead;
                        byte[] z = new byte[y];
                        serialPort2.Read(z, 0, y);
                        for (int i = 0; i < z.Length; i++)
                        {
                            zjresult1.Add(z[i]);
                            if (z[i] == 13 & zjresult1.IndexOf(sbz) + zjresult1.IndexOf(wbz) == 9)
                            {
                                byte[] aaa = new byte[2];                            zjresult1.CopyTo(zjresult1.IndexOf(sbz) + 7, aaa, 0, 2);
                                string zt1 = Convert.ToString(aaa[0], 16);
                                string zt2 = Convert.ToString(aaa[1], 16);
                                string zt11 = zt1.Substring(0, 1);
                                string zt12 = zt1.Substring(1, 1);
                                zjresult1.CopyTo(zjresult1.IndexOf(sbz) + 1, encoding1, 0, 6);
                                result1 = inputstr.encoding1(encoding1);
                                if (zt2.Length == 2)
                                {
                                    string zt22 = zt2.Substring(1, 1);
                                    switch (zt22)
                                    {
                                        case "2":
                                            result1 = result1.Substring(0, 5) + "." + result1.Substring(5, 1);
                                            break;
                                        case "3":
                                            result1 = result1.Substring(0, 4) + "." + result1.Substring(4, 2);
                                            break;
                                        case "4":
                                            result1 = result1.Substring(0, 3) + "." + result1.Substring(3, 3);
                                            break;
                                        case "5":
                                            result1 = result1.Substring(0, 2) + "." + result1.Substring(2, 4);
                                            break;
                                        case "6":
                                            result1 = result1.Substring(0, 1) + "." + result1.Substring(1, 5);
                                            break;
                                        case "7":
                                            result1 = "." + result1;
                                            break;
                                    }
                                    result1 = "-" + result1;
                                }
                                else
                                {
                                    switch (zt2)
                                    {
                                        case "2":
                                            result1 = result1.Substring(0, 5) + "." + result1.Substring(5, 1);
                                            break;
                                        case "3":
                                            result1 = result1.Substring(0, 4) + "." + result1.Substring(4, 2);
                                            break;
                                        case "4":
                                            result1 = result1.Substring(0, 3) + "." + result1.Substring(3, 3);
                                            break;
                                        case "5":
                                            result1 = result1.Substring(0, 2) + "." + result1.Substring(2, 4);
                                            break;
                                        case "6":
                                            result1 = result1.Substring(0, 1) + "." + result1.Substring(1, 5);
                                            break;
                                        case "7":
                                            result1 = "0." + result1;
                                            break;
                                    }
                                }                            cljg1 = Convert.ToDouble(result1);
                                myInvoke1 ma = new myInvoke1(updateform1);
                                this.Invoke(ma, new object[] { result1, zt11, zt12 });                            result1 = string.Empty;
                                zjresult1.Clear();                        }
                        }
                    }
                }
                finally
                { listening = false; }
            }
      

  5.   

    try
                {
                    if (comPort.IsOpen)//端口的状态是打开
                    {                    comPort.Close();//关闭端口
                    }
                    else
                    {
                        comPort.Open();
                    }
                         }            catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
      

  6.   

       /// <summary>
            /// 打开串口,返回true则成功打开
            /// </summary>
            /// <returns></returns>
            public bool Open()
            {
                if (comPort.IsOpen)
                    comPort.Close();
                try
                {
                    comPort.Open();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return comPort.IsOpen;
            }        /// <summary>
            /// 关闭串口,如果返回false,则已关闭
            /// </summary>
            /// <returns></returns>
            public bool CloseComport()
            {
                try
                {
                    if (comPort.IsOpen)
                        comPort.Close();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return comPort.IsOpen;
            }
    //打开串口事件
      comPort = new SerialPort(cmbPort.Text, baudRate, tempParity, dataBits, StopBits.One);                comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
                    comPort.Encoding = myEncode;                if (this.Open())
                    {                   
                        SetTsslMsg("指定串口已打开!");
                    }
    //关闭相关事件和方法
     private void btnClose_Click(object sender, EventArgs e)
            {
                if (!this.CloseComport())
                {
                    SetTsslMsg("串口关闭成功!");
                    button1.Enabled = true;
                }
            }        private void btnExit_Click(object sender, EventArgs e)
            {
                this.Close();
            }//comPort_DataReceived串口接收事件
    void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                //读取串口中一个字节的数据
                this.Invoke(
                    //在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)
                    //即在textBox_ReceiveDate控件的父窗口form中执行委托.
             new MethodInvoker(
                    /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/
             delegate
             {
                 /*匿名方法,   */
                 //// txtMsg.AppendText(comPort.ReadBufferSize.ToString() + "\r\n");
                 List<byte> bytData = new List<byte>();
                 byte[] readBuffer = new byte[comPort.ReadBufferSize + 1];
                 int count = comPort.Read(readBuffer, 0, comPort.ReadBufferSize);
                 string msgRec = myEncode.GetString(readBuffer, 0, count);
                 BaseTools.WriteToLog("LIS端接收到信息:" + msgRec);
      

  7.   

    在serialPort1.Close();之前加一句serialPort1.BreakState = true;强制中断信号试试。
      

  8.   

    http://www.360doc.com/content/12/0217/10/6889381_187283539.shtml看看这个有帮助
      

  9.   

    可能是你读取数据那里有问题,如果是readtovalue,如果找不到value就一直读。所以关闭串口就出错了