2 smilebzj smilebzj 于 2014.12.04 11:55 提问

上位机串口数据卡死 C# PID调试工具

自己用VS2013 C#编了一个类似串口助手的上位机现在出现以下问题
1.调试时未出现卡死任何问题,生成后点击传送数据没问题,但是不断发送就会直接卡死

自己分析:1.我每次传送36个字节,波特率9600
数据量太大
2.程序没有及时释放存储空间,导致卡死
3.程序处理的时间太长,导致处理不够及时
我大致搜了一下,他们说需要用一个线程。具体没学过C#,只是照着,查着学的。请高手帮我想想方法

        以下是部分程序

        串口接收事件:

           private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        if (!radioButton3.Checked)
        {
            textBox1.AppendText(serialPort1.ReadExisting());                                //串口类会自动处理汉字,所以不需要特别转换
        }
        else
        {
            try
            {
                byte[] data = new byte[serialPort1.BytesToRead];                                //定义缓冲区,因为串口事件触发时有可能收到不止一个字节
                serialPort1.Read(data, 0, data.Length);
                if (Displayer != null)
                    Displayer.AddData(data);    //!!!!!
                foreach (byte Member in data)                                                   //遍历用法
                {
                    string str = Convert.ToString(Member, 16).ToUpper();
                    textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");
                }
            }
            catch { }
        }
    }


            以下是数据处理:
              public void AddData(byte[] Data)
    {
        if (Flag == 1)
        {
            for (int i = 0; i < Data.Length; i++)
             DataList.Add(Data[i]);//链表尾部添加数据


    if (DataList.Count - 1 >= (this.ClientRectangle.Width - StartPrint - 240) / DrawStep)//如果数据量大于可容纳的数据量,即删除最左数据
    {
        DataList.RemoveRange(0, 35);
    }
            data_get();
        }
            Invalidate();//刷新显示

    }


    public void data_get()
    { 
    for (int i = DataList.Count -36  ; i < DataList.Count - 1; i++)    //数据包分配
            {

                if( DataList[i] == 0x50 )                       
                {
                    switch(DataList[i+1]) 
                   {
                       case 0x56:
                           {


                               for (int j = 0; j < 4; j++)
                               { 
                                   Now_Data[j] = DataList[i + 2 + j];     //实时值数组

                               }

                               break;
                           }

                       case 0x51:
                           {


                               for (int j = 0; j < 4; j++)
                               {
                                   fData[j] = DataList[i + 2 + j];      //目标值数据
                               }
                               break;
                           }

                       case 0x52:
                           {
                               for (int j = 0; j < 4; j++)
                               {
                                   P_Data[j] = DataList[i + 2 + j];   //P数据
                               }
                               break;
                           }

                       case 0x53:
                           {
                               for (int j = 0; j < 4; j++)
                               {
                                   I_Data[j] = DataList[i + 2 + j];
                               }
                               break;
                           }

                       case 0x54:
                           {
                               for (int j = 0; j < 4; j++)
                               {
                                   D_Data[j] = DataList[i + 2 + j];
                               }
                               break;
                           }

                       case 0x55:
                           {
                               for (int j = 0; j < 4; j++)
                               {
                                   PWM_Data[j] = DataList[i + 2 + j];
                               }
                               break;
                           }

                    }
                }

            }

    N_val[0]= BitConverter.ToSingle(Now_Data, 0);   //以下为byte转化为float类型
    Goal_val = BitConverter.ToSingle(fData, 0);
    P_val = BitConverter.ToSingle(P_Data, 0);
    I_val = BitConverter.ToSingle(I_Data, 0);
    D_val = BitConverter.ToSingle(D_Data, 0);
    PWM_val = BitConverter.ToSingle(PWM_Data, 0);



    if (N_Data.Count - 1 >= (this.ClientRectangle.Width - StartPrint - 240) / DrawStep)//如果数据量大于可容纳的数据量,即删除最左数据
    {
        N_Data.RemoveRange(0, 5);
    }
    N_Data.Add(N_val[0]);    
    textBox10.Text = (N_val[0]).ToString();        //以下为文本显示
    textBox11.Text = Goal_val.ToString();
    textBox12.Text = PWM_val.ToString();
    textBox16.Text = P_val.ToString();
    textBox17.Text = I_val.ToString();
    textBox15.Text = D_val.ToString();
    }
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!