juicees 2014-12-04 03:55
浏览 2776

上位机串口数据卡死 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();
    }
  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥20 sub地址DHCP问题
    • ¥15 delta降尺度计算的一些细节,有偿
    • ¥15 Arduino红外遥控代码有问题
    • ¥15 数值计算离散正交多项式
    • ¥30 数值计算均差系数编程
    • ¥15 redis-full-check比较 两个集群的数据出错
    • ¥15 Matlab编程问题
    • ¥15 训练的多模态特征融合模型准确度很低怎么办
    • ¥15 kylin启动报错log4j类冲突
    • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大