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(); } }
|