我用C#写串口通信时 出现一个很奇怪的问题 就是用C#写的串口和控制板可以发送 接受相应的数据, 然后把c#软件关了 用串口助手调试的话就出现串口助手不能接受数据,只能发送数据。如果要用串口助手调试的话,就得电脑重启。请问下各位高手 这个问题改怎么解决 谢谢!!

解决方案 »

  1.   

    代码逻辑??
      /// <summary>
            /// 串口接受数据
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void SerialPort1_DataReceived(object sender,System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                if (Closing) return;
                try
                {
                    Listening = true;
                    string text = string.Empty;
                    int n = SerialPort1.BytesToRead;
                    byte[] result = new byte[n];
                    SerialPort1.Read(result, 0, n);
                    Operator(result);//数据处理
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message + "111");
                }
                finally
                {
                    Listening = false;
                    SerialPort1.DiscardOutBuffer();
                    
                    SerialPort1.DiscardInBuffer();
                }
            }
    ///发送数据部分
     Form1 from1 = new Form1();
            public static void SendByPorts(byte[] buffer)
            {
                if (Form1.SerialPort1.IsOpen)
                {
                    try
                    {
                        string lString = null;
                        Form1.SerialPort1.Write(buffer, 0, buffer.Length);
                        for (int i = 0; i < buffer.Length; i++)
                        {
                            string b1 = null;
                            string b = Convert.ToString(buffer[i], 16);
                            if (b.Length < 2)
                            {
                                b1 = "0" + b.ToString();
                            }
                            else
                            {
                                b1 = b.ToString();
                            }
                            lString += b1 + " ";
                        }
                        Form1.stinglist.Clear();
                        Form1.stinglist.Insert(0, lString);
                    }
                    catch (Exception err)
                    {                }
                }
            }
    帖代码看看那个地方逻辑有问题
      

  2.   

    几个不好的习惯先给你说一下
    首先,不要在线程中使用MessageBox.Show方法。
    其次,不要大量使用try做毫无预计的异常处理,应当有针对性的处理,否则就不要处理,调试阶段,出现异常进入debug更容易找到问题。
    代码风格貌似很熟悉,和我某些风格蛮像,不过有些疏漏。排查错误要靠经验和耐心,知识未必能一定管用,你可以试着屏蔽掉一些代码来确定问题所在的代码块。比如你没贴出来的:Operator方法调用,你可以试着不调用看看。
    还有
    Form1.SerialPort1.Write(buffer, 0, buffer.Length);这是个怎么写法呢?用的是静态成员变量么?为什么要这么用?buffer会不会出错?
      

  3.   

    关于那个messagebox 只是让他在运行时截获异常位置 关于那个SeriPort 是定义的位static  
      

  4.   

    关于Operator
      byte[] data=new byte[9];
     public void CloseWork(object o)
            {
                StateObject spo = (StateObject)o;
                mutex.WaitOne();    
                for (int i = 0; i < data.Length; i++)
                {
                    data[i] = 0x00;
                }
                data[0] = 0xaa;
                data[1] = 0x01;
                data[2] = 0x00;
                data[3] = 0x80;
                data[4] = 0x04;
                data[5] = 0x10;
                data[6] = 0x01;
                data[7] = 0x15;
                data[8] = 0x55;
                Port.SendByPorts(data);//Port类下面是一个发送数据的类
                mutex.ReleaseMutex();
            }class Port
        {
            Form1 from1 = new Form1();
            public static void SendByPorts(byte[] buffer)
            {
                if (Form1.SerialPort1.IsOpen)
                {
                    try
                    {
                        Form1.SerialPort1.Write(buffer, 0, buffer.Length);//SerialPort 为form1的静态变量           
                    }
                    catch (Exception err)
                    {                }
                    finally
                    {
                        Form1.SerialPort1.DiscardInBuffer();
                        Form1.SerialPort1.DiscardOutBuffer();
                    }
                }
            }
      

  5.   

    各位高手,我用的是usb转串口,也就是虚拟串口,C#写串口程序的时候,能正常通信,但是在发送数据之后等待回复的时候释放资源关闭程序,再重新打开程序打开串口的时候就卡在那里了,在Open方法之前串口状态是关闭状态,请教高手:再次打开怎么会卡在Open()方法上