C#上位機串口通信帶曲線顯示和歷史曲線查看

1:應用程序界面

2:實現的功能

(1)常規的串口收發操作

(2)私有通信協議的格式轉化

(3)數據的定時刷新顯示和實時存儲(txt)

(4)數據的歷史曲線查看

3:實現的方式

串口設置的核心代碼

 private void SearchAndAddSerialToComboBox(SerialPort MyPort, ComboBox MyBox)
        {                                                               //將可用端口號添加到ComboBox
            string[] MyString = new string[20];                         //最多容納20個,太多會影響調試效率
            string Buffer;                                              //緩存
            MyBox.Items.Clear();                                        //清空ComboBox內容
            for (int i = 1; i < 20; i++)                                //循環
            {
                try                                                     //核心原理是依靠try和catch完成遍歷
                {
                    Buffer = "COM" + i.ToString();
                    MyPort.PortName = Buffer;
                    MyPort.Open();                                      //如果失敗,後面的代碼不會執行
                    MyString[i - 1] = Buffer;
                    MyBox.Items.Add(Buffer);                            //打開成功,添加至下拉列表
                    MyPort.Close();                                     //關閉
                }
                catch
                {

                }
            }
            MyBox.Text = MyString[0];                                   //初始化
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)                                     //串口打開就關閉
            {
                try
                {
                    serialPort1.Close();
                }
                catch { }                                               //確保萬無一失
                button1.Text = "打開串口";
                Button1Statue = false;                                  //按鈕狀態                
            }
            else
            {
                try
                {
                    serialPort1.PortName = comboBox1.Text;              //端口號
                    serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);//十進制數據轉換
                    serialPort1.DataBits = Convert.ToInt32(comboBox3.Text, 10);//十進制數據轉換
                    switch (comboBox4.Text)
                    {
                        case "0":
                            serialPort1.StopBits = StopBits.None;
                            break;
                        case "1":
                            serialPort1.StopBits = StopBits.One;
                            break;
                        case "1.5":
                            serialPort1.StopBits = StopBits.OnePointFive;
                            break;
                        case "2":
                            serialPort1.StopBits = StopBits.Two;
                            break;
                        default:
                            MessageBox.Show("Error:參數不正確", "Error");
                            break;
                    }
                    serialPort1.Open();                                 //打開端口
                    button1.Text = "關閉串口";
                    Button1Statue = true;                                //按鈕狀態
                }
                catch
                {
                    MessageBox.Show("串口打開失敗", "錯誤");
                }
            }
        }

定時刷新顯示的核心代碼:

 private void refresh_curve()
        {
            while (true)
            {
                string test_time = DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss");
                string Path1 = "";

                if (starttime == "")
                {
                    Path1 = get_latest_file(Datapath);
                }
                else
                {
                    Path1 = @".\data\" + starttime + ".txt";
                }
                /*調試代碼
                lstReceiveMsg.Invoke(new EventHandler(delegate
                {
                    lstReceiveMsg.AppendText(test_time + "-->" + "\r\n");
                    lstReceiveMsg.AppendText(Path1 + "-->" + "\r\n");                                        
                }));
                 */
                // 從文件中讀取並顯示每行
                string line = "";
                try
                {
                    using (StreamReader sr = new StreamReader(Path1))
                    {
                        SortedList sl = new SortedList();
                        while ((line = sr.ReadLine()) != null)
                        {
                            string[] array = line.Split('+');
                            sl.Add(array[0], array[1]);
                        }
                        // 獲取鍵的集合
                        ICollection key = sl.Keys;
                        foreach (string k in key)
                        {
                            //  Console.WriteLine(k + ": " + sl[k]);
                            Time_axis.Add(k);
                            Curve.Add(sl[k].ToString().Split(',')[type_curve]);
                        }
                    }

                }
                catch
                {
                    using (StreamReader sr = new StreamReader(get_latest_file(Datapath)))
                    {
                        SortedList sl = new SortedList();
                        while ((line = sr.ReadLine()) != null)
                        {
                            string[] array = line.Split('+');
                            sl.Add(array[0], array[1]);
                        }
                        // 獲取鍵的集合
                        ICollection key = sl.Keys;
                        foreach (string k in key)
                        {
                            //  Console.WriteLine(k + ": " + sl[k]);
                            Time_axis.Add(k);
                            Curve.Add(sl[k].ToString().Split(',')[type_curve]);
                        }
                    }
                    Console.WriteLine("沒有當前時間段數據:" + Path1);
                }
                
                //建立委託機制,防止線程間異常
                chart1.Invoke(new EventHandler(delegate
                {
                    chart1.Series[0].Points.DataBindXY(Time_axis, Curve);
                    chart1.Series[0].Name = chart_series_name[type_curve];
                }));
             

                Thread.Sleep(3000);
                Time_axis.Clear();
                Curve.Clear();
            }
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章