上位机软件设计--串口与曲线图实时显示

 static double THRESHOLD_PARAM = 8;
        static double FILTER_PARAMETER = 16;
        static int SAMPLE_RATE = 250;
        public static String Road ="";
        public static String result = "";
        public static String result1 = "";
        public static String result2 = "";
        public static HttpWebRequest httpReq = null;
        public static List<int> HeartData = new List<int>();
        public static List<int> HeartDataHandleS1 = new List<int>();
        public static List<int> HeartDataHandleS2 = new List<int>();
        private SerialPort comm = new SerialPort();
        private SerialPort comm_1 = new SerialPort();
        private SerialPort comm_2 = new SerialPort();
        private SerialPort comm_4 = new SerialPort();

        private StringBuilder builder = new StringBuilder();//避免在事件处理方法中反复的创建,定义到外面。
        private long received_count = 0;//接收计数
        private long send_count = 0;//发送计数
        private bool Listening = false;//是否没有执行完invoke相关操作 
        private bool Closing = false;
        string[] Str = new string[1024];
        List<byte> buffer = new List<byte>(6);
        public static String Roadpicture = "";
        public static String WSS;
        public static String WSZ;
        public static String H;
        public static String BO;
        public static String Temp;
       
      FileInfo finfo = null;
        private Random r;
        StreamWriter sw;
        System.Windows.Forms.Timer chartTimer = new System.Windows.Forms.Timer();
 private void Form1_Load(object sender, EventArgs e)
        {
            comm_2.PortName = "COM17";   //血压
            comm_2.BaudRate = 115200;
            comm_2.Open();
            comm_2.NewLine = "\r\n";
            comm_2.RtsEnable = true;//根据实际情况吧。
            comm_2.DataReceived += comm_DataReceived_3;



            //comm_1.PortName = "COM7";    //心电波
            //comm_1.BaudRate = 115200;
            //comm_1.Open();
            //comm_1.NewLine = "\r\n";
            //comm_1.RtsEnable = true;//根据实际情况吧。
            //comm_1.DataReceived += comm_DataReceived_1;

            comm.PortName = "COM18";     
            comm.BaudRate = 115200;
            comm.Open();

            //初始化SerialPort对象
            comm.NewLine = "\r\n";
            comm.RtsEnable = true;//根据实际情况吧。
        

            添加事件注册
            comm.DataReceived += comm_DataReceived_2; //血氧 FF C7 03 A3 A0

            comm_4.PortName = "COM19";
            comm_4.BaudRate = 115200;
            comm_4.Open();

            //初始化SerialPort对象
            comm_4.NewLine = "\r\n";
            comm_4.RtsEnable = true;//根据实际情况吧。


            添加事件注册
            comm_4.DataReceived += comm_DataReceived_4; //体温 FF C9 03 A3 A0

        }
void comm_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
        {
           //
            //  if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 
            try
            {
               
                Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。 
                int n = comm_1.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 
                byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 
              //  received_count += n;//增加接收计数 
                comm_1.Read(buf, 0, n);//读取缓冲数据 
             //   builder.Clear();//清除字符串构造器的内容 
                //因为要访问ui资源,所以需要使用invoke方式同步ui。 
                this.BeginInvoke((EventHandler)(delegate
                {
                    //判断是否是显示为16进制 
                    if (n > 8)
                    {
                     
                   
                        System.Windows.Forms.DataVisualization.Charting.Series series0 = chart1.Series[0];
                        chart1.ChartAreas[0].AxisX.Interval = 20;
                        chart1.ChartAreas[0].AxisY.Interval = 20;
                        chart1.Series[0].Color = Color.Black;
                        for (int i = 8; i < n - 1; i++)
                        {
                            HeartData.Add(buf[i]);
                            series0.Points.AddY(buf[i]);
                                                  
                            if (HeartData.Count == 400)
                            {
                                int[] result = SoAndChan(HeartData.ToArray());
                                if(result.Length>0)
                                for(int l=0;l< result.Length;l++)
                                {
                                        // textBoxH.AppendText(Convert.ToString(result[l]+","));
                                        if (HeartDataHandleS1.Count < 6)
                                            HeartDataHandleS1.Add(HeartData[result[l]]);
                                        else
                                            HeartDataHandleS2.Add(HeartData[result[l]]);
                                }
                                HeartData.Clear();

                            }
                         
                        }
                        chart1.ChartAreas[0].AxisX.Maximum = 1300;
                        chart1.ChartAreas[0].AxisX.Minimum = 0;
                        if (chart1.Series[0].Points.Count > 100)
                        {
                            chart1.Series[0].Points.RemoveAt(0);
                            chart1.Series[0].Points.RemoveAt(1);
                            chart1.Series[0].Points.RemoveAt(2);
                            chart1.Series[0].Points.RemoveAt(3);
                            chart1.Series[0].Points.RemoveAt(4);
                            chart1.Series[0].Points.RemoveAt(5);
                            chart1.Series[0].Points.RemoveAt(6);
                            chart1.Series[0].Points.RemoveAt(7);
                            chart1.Series[0].Points.RemoveAt(8);
                            chart1.Series[0].Points.RemoveAt(9);
                            chart1.Series[0].Points.RemoveAt(10);
                            chart1.Series[0].Points.RemoveAt(11);
                            chart1.Series[0].Points.RemoveAt(12);
                            chart1.Series[0].Points.RemoveAt(13);
                            chart1.Series[0].Points.RemoveAt(14);
                            chart1.Series[0].Points.RemoveAt(15);
                            chart1.Series[0].Points.RemoveAt(16);
                            chart1.Series[0].Points.RemoveAt(17);
                            chart1.Series[0].Points.RemoveAt(18);
                            chart1.Series[0].Points.RemoveAt(19);
              
                           
                        }
                        if (HeartDataHandleS1.Count > 5&& HeartDataHandleS2.Count>5)
                        {
                            var data = new List<double[]>() {
                            new double[] {111,154,132.5},
                            new double[] {123,134,128.81},
                            new double[] {140,160,152.14},
                            new double[] {140,204,176},
                            new double[] {160,184,172},
                            new double[] {159,165,162},
                            };
                            var labels = new List<int>()
                            {
                                1,1,1,0,0,0
                             };
                            MachineLearning.Classification.KNN knn = new KNN(k: 3, labels: labels, features: data);
                           // knn.Display();
                            knn.Classify(new double[][] { new double[] { HeartDataHandleS1.Min(), HeartDataHandleS1.Max(), HeartDataHandleS1.Average() } });
                            result1 = knn.Display();
                            knn.Classify(new double[][] { new double[] { HeartDataHandleS2.Min(), HeartDataHandleS2.Max(), HeartDataHandleS2.Average() } });
                            result2 = knn.Display();
                            if (result1.Equals("1")&& result2.Equals("1"))
                                textBoxH.AppendText("心率没有异常!"+"\n");
                            else
                                textBoxH.AppendText("心率有异常!");
                            textBox2.Text = @"心率:" + H + "\n" + "血氧饱和度:" + BO + "\n" + "舒张压:" + WSZ + "\n" + "伸缩压: " + WSS + "\n"+"体温:"+Temp+"\n";
                            HeartDataHandleS1.Clear();
                            HeartDataHandleS2.Clear();
                        }

                       
                        if (series0.Points.Count > 2000)
                        {
                            ExportChart("chart", chart1);
                            series0.Points.Clear();
                        }
                        //  mycon.Close();
                    }
                    //追加的形式添加到文本框末端,并滚动到最后。 
                    //this.txGet.AppendText(builder.ToString());

                    //修改接收计数 
                    //labelGetCount.Text = "Get:" + received_count.ToString();
                }));
            }
            finally
            {

                Listening = false;//我用完了,ui可以关闭串口了。 
            }
        }

        void comm_DataReceived_3(object sender, SerialDataReceivedEventArgs e)
        {
            //
            //  if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 
            try
            {
                int n = comm_2.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 
                byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 
                                         //  received_count += n;//增加接收计数 
                comm_2.Read(buf, 0, n);
                this.BeginInvoke((EventHandler)(delegate
                {
                    //判断是否是显示为16进制 
                    //                    comm_2.WriteLine(new string(new char[] { FF C0 03 A3 A0 }));
                
                    if(n==10)
                    {
                        textBox4.AppendText("收缩压:"+buf[6].ToString() + ",");
                        textBox4.AppendText("舒张压:"+buf[8].ToString() + ",");
                        textBox4.AppendText("心率为:"+buf[9].ToString());
                        WSS = buf[6].ToString();
                        WSZ = buf[8].ToString();
                        H = buf[9].ToString();
                    }
                }));
            }
            finally
            {
              

            }
        }

        void comm_DataReceived_4(object sender, SerialDataReceivedEventArgs e)
        {
            //
            //  if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 
            try
            {
                int n = comm_4.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 
                byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 
                                         //  received_count += n;//增加接收计数 
                comm_4.Read(buf, 0, n);
                this.BeginInvoke((EventHandler)(delegate
                {
                    //判断是否是显示为16进制 
                    //                    comm_2.WriteLine(new string(new char[] { FF C0 03 A3 A0 }));

                    if (n == 7)
                    {
                      //  textBox4.AppendText("体温:" + buf[5].ToString() + ",");
                        textBox4.AppendText("体温:" + (buf[6]-71) + ",");
                        Temp = (buf[6] - 71).ToString();
                    }
                }));
            }
            finally
            {

            }
        }







        void comm_DataReceived_2(object sender, SerialDataReceivedEventArgs e)
        {
            //
            //  if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 
            try
            {
                 
                Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。 
                int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 
                byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 
         //       received_count += n;//增加接收计数 
                comm.Read(buf, 0, n);//读取缓冲数据 
       //         builder.Clear();//清除字符串构造器的内容 
                //因为要访问ui资源,所以需要使用invoke方式同步ui。 
                this.BeginInvoke((EventHandler)(delegate
                {
                    //判断是否是显示为16进制 
                    if (n > 7)
                    {
                     
                        chart2.ChartAreas[0].AxisX.Interval = 8;
                        chart2.ChartAreas[0].AxisY.Interval = 10;
                        chart3.ChartAreas[0].AxisX.Interval = 8;
                        chart3.ChartAreas[0].AxisY.Interval = 10;
                        chart4.ChartAreas[0].AxisX.Interval = 8;
                        chart4.ChartAreas[0].AxisY.Interval = 10;
                      
                       

                        System.Windows.Forms.DataVisualization.Charting.Series series0 = chart2.Series[0];
                        System.Windows.Forms.DataVisualization.Charting.Series series1 = chart3.Series[0];
                        System.Windows.Forms.DataVisualization.Charting.Series series3 = chart4.Series[0];
                        chart2.Series[0].Color = Color.Black;
                        chart3.Series[0].Color = Color.Black;
                        chart4.Series[0].Color = Color.Black;

                        //   for (int i = 8; i < n - 1; i++)
                        //  {
                        series0.Points.AddY(buf[7]); //HEARTh
                        series1.Points.AddY(buf[5]);  //WAVE
                        series3.Points.AddY(buf[6]);  //bo
                        BO = buf[6].ToString();
                //        SendHeartData(buf[7].ToString()+","+buf[5].ToString()+","+buf[6].ToString());

                        chart2.ChartAreas[0].AxisX.Maximum = 200;
                        chart2.ChartAreas[0].AxisX.Minimum = 0;
                        if (chart2.Series[0].Points.Count > 200)
                        {
                            chart2.Series[0].Points.RemoveAt(0);
                            if (chart2.Series[0].Points.Count > 1000)
                            {
                                ExportChart("chart2", chart2);
                                ExportChart("chart4", chart4);
                                chart2.Series[0].Points.Clear();
                                //    series1.Points.Clear();
                               
                            }
                        }
                        chart3.ChartAreas[0].AxisX.Maximum = 200;
                        chart3.ChartAreas[0].AxisX.Minimum = 0;
                        if (chart3.Series[0].Points.Count > 190)
                        {
                            chart3.Series[0].Points.RemoveAt(0);
                            chart3.Series[0].Points.RemoveAt(1);
                      //      chart3.Series[0].Points.RemoveAt(2);
                     //       chart3.Series[0].Points.RemoveAt(3);
                     //       chart3.Series[0].Points.RemoveAt(4);
                     //       chart3.Series[0].Points.RemoveAt(5);
                           // chart3.Series[0].Points.RemoveAt(6);
                           // chart3.Series[0].Points.RemoveAt(7);
                            //chart3.Series[0].Points.RemoveAt(8);
                            //chart3.Series[0].Points.RemoveAt(9);
                        }
                        chart4.ChartAreas[0].AxisX.Maximum = 200;
                        chart4.ChartAreas[0].AxisX.Minimum = 0;
                        if (chart4.Series[0].Points.Count > 200)
                        {
                             chart4.Series[0].Points.RemoveAt(0);
                            if (chart4.Series[0].Points.Count > 1000)
                            {
                                ExportChart("chart2", chart2);
                                ExportChart("chart3", chart3);
                                ExportChart("chart4", chart4);
                                chart4.Series[0].Points.Clear();
                                chart3.Series[0].Points.Clear();
                            }
                         
                        }
                     
                        //  mycon.Close();
                    }
                    //追加的形式添加到文本框末端,并滚动到最后。 
                    //this.txGet.AppendText(builder.ToString());

                    //修改接收计数 
                    //labelGetCount.Text = "Get:" + received_count.ToString();
                }));
            }
            finally
            {
                Listening = false;//我用完了,ui可以关闭串口了。 
            }
        }

        private static void DataBind()
        {
            throw new NotImplementedException();
        }
        private void buttonOpenClose_Click(object sender, EventArgs e)
        {
            //根据当前串口对象,来判断操作 
            if (comm.IsOpen)
            {
                Closing = true;
                while (Listening) System.Windows.Forms.Application.DoEvents();
                //打开时点击,则关闭串口 
                comm.Close();
                Closing = false;
            }
            else
            {
                //关闭时点击,则设置好端口,波特率后打开 
                comm.PortName = comboPortName.Text;
            //    comm.BaudRate = int.Parse(comboBaudrate.Text);
                try
                {
                    comm.Open();
                }
                catch (Exception ex)
                {
                    //捕获到异常信息,创建一个新的comm对象,之前的不能用了。 
                    comm = new SerialPort();
                    //现实异常信息给客户。 
                    MessageBox.Show(ex.Message);
                }
            }
            //设置按钮的状态 
            //buttonOpenClose.Text = comm.IsOpen ? "Close" : "Open";
        }
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值