C#实现串口示波器

Kohana ·
更新时间:2024-11-13
· 1490 次阅读

本文实例为大家分享了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<int> DealData(string datas, Regex r, string split)          {             if (string.IsNullOrEmpty(datas))             {                 throw new ArgumentException($"“{nameof(datas)}”不能是 Null 或为空。", nameof(datas));             }             List<int> list1=new List<int> { };             string s1="";             MatchCollection mc = r.Matches(datas);  //提取符合要求的字符串             for (int i = 0; i < mc.Count; i++)             {                 textBox2.AppendText(mc[i].Value + "\r\n");    //测试数据是否正确输出                 s1 = s1 + mc[i].Value;             }             string[] d = s1.Split( new string[]{split}, StringSplitOptions.RemoveEmptyEntries);             for (int i=0;i<d.Length;i++)            //将数字存入列表             {                 list1.Add( int.Parse(d[i]));             }             //测试画图用的数据是否解析正确             if (split.Equals("LP4:"))             {                 foreach (int m in list1)                 {                     textBox3.AppendText(m + "\r\n");                 }             }             return list1;         }          private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)         {         }         private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)         {                 serialPort1.BaudRate = int.Parse(comboBox2.SelectedItem.ToString());         }         private void searchPort()         {             string Buffer;             comboBox1.Items.Clear();             for (int i = 1; i < 20; i++)             {                 try                 {                     Buffer = "COM" + i.ToString();                     serialPort1.PortName = Buffer;                     serialPort1.Open();                     comboBox1.Items.Add(Buffer);                     comboBox1.SelectedItem = Buffer;                     serialPort1.Close();                 }                 catch                 { }             }         }         private void getDatas()          {             System.Text.RegularExpressions.Regex r1 = new System.Text.RegularExpressions.Regex("LP1:(-?)\\d+");             System.Text.RegularExpressions.Regex r2 = new System.Text.RegularExpressions.Regex("LP2:(-?)\\d+");             System.Text.RegularExpressions.Regex r3 = new System.Text.RegularExpressions.Regex("LP3:(-?)\\d+");             System.Text.RegularExpressions.Regex r4 = new System.Text.RegularExpressions.Regex("LP4:(-?)\\d+");             System.Text.RegularExpressions.Regex r5 = new System.Text.RegularExpressions.Regex("LP5:(-?)\\d+");             System.Text.RegularExpressions.Regex r6 = new System.Text.RegularExpressions.Regex("CC1:(-?)\\d+");             System.Text.RegularExpressions.Regex r7 = new System.Text.RegularExpressions.Regex("CC2:(-?)\\d+");             System.Text.RegularExpressions.Regex r8 = new System.Text.RegularExpressions.Regex("CC3:(-?)\\d+");             System.Text.RegularExpressions.Regex r9 = new System.Text.RegularExpressions.Regex("CC4:(-?)\\d+");             System.Text.RegularExpressions.Regex r10 = new System.Text.RegularExpressions.Regex("CC5:(-?)\\d+");             byte[] inbuffer = null;             //Queue<int> q1 = new Queue<int>();             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("串口未打开!");                 }             }         }     } }

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

最终实现的效果



C# 示波器 串口

需要 登录 后方可回复, 如果你还没有账号请 注册新账号