C#实现串口示波器

这篇文章主要为大家详细介绍了C#实现串口示波器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C#实现串口示波器的具体代码,供大家参考,具体内容如下

开发工具

  • visual studio2019

C#串口示波器,实时刷新端口号,动态绘制多条折线,获取串口数据并输出到文本框
之前用Java实现串口示波器对我来说还是比较困难的,而且实现的效果不尽如人意,就用C#开发了。
C#可以自由布置界面,在工具栏直接拖拽控件到窗体,然后双击控件就能添加事件了,很方便
最终效果是实现了,但是有个数据丢失的问题

数据处理到绘图分三个步骤:

1、获取串口发送的数据
2、把数据按需要提取到中间容器集合list1中
3、从集合中提取绘图的y值

测试得出的结果就是数据放进集合前不存在丢失,从集合中拿出数据这一过程也没问题。所以问题就出在第二步了,已解决(按需提取数据的规则要尽可能设置的详细一点就行)。

代码:

namespace CommPortsDesigner {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }         private void Form1_Load(object sender, EventArgs e) //窗体运行完成即为加载,加载完成会触发事件         {         }         //传入原始数据datas及需要匹配的字符串r,得到需要的数据列表list         private List DealData(string datas, Regex r, string split)          {             if (string.IsNullOrEmpty(datas))             {                 throw new ArgumentException($"“{nameof(datas)}”不能是 Null 或为空。", nameof(datas));             }                         List list1=new List { };             string s1="";             MatchCollection mc = r.Matches(datas);  //提取符合要求的字符串             for (int i = 0; i  q1 = new Queue();             if (serialPort1.IsOpen && serialPort1.BytesToRead > 0)             {                 chart1.ChartAreas[0].AxisX.LabelStyle.Format = "hh:mm:ss.ff";                 chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Milliseconds;                 chart1.ChartAreas[0].AxisX.MajorGrid.IntervalType = DateTimeIntervalType.Milliseconds;                 try                 {                     inbuffer = new byte[serialPort1.BytesToRead];                     serialPort1.Read(inbuffer, 0, serialPort1.BytesToRead);                     string strRaad = ASCIIEncoding.ASCII.GetString(inbuffer, 0, inbuffer.Length);                     textBox1.AppendText(strRaad);                     chart1.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-5).ToOADate();                     chart1.ChartAreas[0].AxisX.Maximum = DateTime.Now.ToOADate();                     chart1.ChartAreas[0].AxisX.Interval = 500;                     if (btn_start.Text.Equals("停止"))                     {                         //LP1                         if (checkBox2.Checked)                         {                             foreach (int y in DealData(strRaad, r2, "LP2:"))                             {                                 chart1.Series[1].Points.AddXY(DateTime.Now.ToOADate(), y);                                 //count2 = count2 + 5;                             }                         }                         else                         {                             chart1.Series[1].Points.Clear();                         }                                                  //LP2                         if (checkBox2.Checked)                         {                             foreach (int y in DealData(strRaad, r2, "LP2:"))                             {                                 chart1.Series[1].Points.AddXY(DateTime.Now.ToOADate(), y);                                 //count2 = count2 + 5;                             }                         }                         else                         {                             chart1.Series[1].Points.Clear();                         }                         //LP3                         if (checkBox3.Checked)                         {                             foreach (int y in DealData(strRaad, r3, "LP3:"))                             {                                 chart1.Series[2].Points.AddXY(DateTime.Now.ToOADate(), y);                                 //count3 = count3 + 5;                             }                         }                         else                         {                             chart1.Series[2].Points.Clear();                         }                         //LP4                         if (checkBox4.Checked)                         {                             foreach (int y in DealData(strRaad, r4, "LP4:"))                             {                                 chart1.Series[3].Points.AddXY(DateTime.Now.ToOADate(), y);                                //count4 = count4 + 5;                             }                         }                         else                         {                             chart1.Series[3].Points.Clear();                         }                         //LP5                         if (checkBox5.Checked)                         {                             foreach (int y in DealData(strRaad, r5, "LP5:"))                             {                                 chart1.Series[4].Points.AddXY(DateTime.Now.ToOADate(), y);                                 //count5 = count5 + 5;                             }                         }                         else                         {                             chart1.Series[4].Points.Clear();                         }                         //CC1                         if (checkBox6.Checked)                         {                             foreach (int y in DealData(strRaad, r6, "CC1:"))                             {                                 chart1.Series[5].Points.AddXY(DateTime.Now.ToOADate(), y);                                 //count6 = count6 + 5;                             }                         }                         else                         {                             chart1.Series[5].Points.Clear();                         }                         //CC2                         if (checkBox7.Checked)                         {                             foreach (int y in DealData(strRaad, r7, "CC2:"))                             {                                 chart1.Series[6].Points.AddXY(DateTime.Now.ToOADate(), y);                                 //count7 = count7 + 5;                             }                         }                         else                         {                             chart1.Series[6].Points.Clear();                         }                         //CC3                         if (checkBox8.Checked)                         {                             foreach (int y in DealData(strRaad, r8, "CC3:"))                             {                                 chart1.Series[7].Points.AddXY(DateTime.Now.ToOADate(), y);                                 //count8 = count8 + 5;                             }                         }                         else                         {                             chart1.Series[8].Points.Clear();                         }                         //CC4                         if (checkBox9.Checked)                         {                             foreach (int y in DealData(strRaad, r9, "CC4:"))                             {                                 chart1.Series[8].Points.AddXY(DateTime.Now.ToOADate(), y);                                 //count9 = count9 + 5; }                         }                         else                         {                             chart1.Series[8].Points.Clear();                         }                         //CC5                         if (checkBox10.Checked)                         {                             foreach (int y in DealData(strRaad, r10, "CC5:"))                             {                                 chart1.Series[9].Points.AddXY(DateTime.Now.ToOADate(), y);                                 //count10 = count10 + 5;                             }                         }                         else                         {                             chart1.Series[9].Points.Clear();                         }                     }                 }                 catch                 {                 }             }         }                 private void btn_open_Click(object sender, EventArgs e)         {             if (serialPort1.IsOpen||btn_open.Text.Equals("关闭"))             {                 try                 {                     serialPort1.Close();                     btn_open.Text = "打开";                 }                 catch                 { }             }             else             {                 try                 {                     serialPort1.PortName = comboBox1.Text;                     serialPort1.Open();                     btn_open.Text = "关闭";                 }                 catch                 {                     MessageBox.Show("串口打开失败!", "错误");                 }             }                      }         private void timer1_Tick(object sender, EventArgs e)         {             if (!serialPort1.IsOpen)             {                 searchPort();             }             else{}                          getDatas();         }         private void btn_clear_Click(object sender, EventArgs e)         {              textBox1.Clear();         }         private void btn_save_Click(object sender, EventArgs e)         {             if (this.textBox1.TextLength > 0)             {                 string path = "D:\\log.txt";                 using (StreamWriter sw = new StreamWriter(path, true))                 {                     String time = DateTime.Now.ToLocalTime().ToString();                     sw.WriteLine("\n" + time);                     sw.Write(this.textBox1.Text);                 }                 MessageBox.Show("已保存到 D:\\log.txt!");             }         }         private void btn_start_Click(object sender, EventArgs e)         {             if (serialPort1.IsOpen)             {                 if (btn_start.Text.Equals("开始"))                 {                     try                     {                         btn_start.Text = "停止";                     }                     catch                     { }                 }                 else                 {                     try                     {                         btn_start.Text = "开始";                     }                     catch                     {                     }                 }             }             else              {                 if (btn_start.Text.Equals("停止"))                 {                     try                     {                         btn_start.Text = "开始";                     }                     catch                     { }                 }                 else                  {                     MessageBox.Show("串口未打开!");                 }             }         }     } }

因为第一次开发,所以要实现的功能代码都放在一个类里了,大家将就着看吧

最终实现的效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持0133技术站。

以上就是C#实现串口示波器的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程