如何使用C#实现串口示波器
这篇文章主要为大家展示了“如何使用C#实现串口示波器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C#实现串口示波器”这篇文章吧。
具体内容如下
开发工具visual studio2019
C#串口示波器,实时刷新端口号,动态绘制多条折线,获取串口数据并输出到文本框
之前用Java实现串口示波器对我来说还是比较困难的,而且实现的效果不尽如人意,就用C#开发了。
C#可以自由布置界面,在工具栏直接拖拽控件到窗体,然后双击控件就能添加事件了,很方便
最终效果是实现了,但是有个数据丢失的问题
数据处理到绘图分三个步骤:
1、获取串口发送的数据
2、把数据按需要提取到中间容器集合list1中
3、从集合中提取绘图的y值
测试得出的结果就是数据放进集合前不存在丢失,从集合中拿出数据这一过程也没问题。所以问题就出在第二步了,已解决(按需提取数据的规则要尽可能设置的详细一点就行)。
代码:
namespaceCommPortsDesigner{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse)//窗体运行完成即为加载,加载完成会触发事件{}//传入原始数据datas及需要匹配的字符串r,得到需要的数据列表listprivateList<int>DealData(stringdatas,Regexr,stringsplit){if(string.IsNullOrEmpty(datas)){thrownewArgumentException($"“{nameof(datas)}”不能是Null或为空。",nameof(datas));}List<int>list1=newList<int>{};strings1="";MatchCollectionmc=r.Matches(datas);//提取符合要求的字符串for(inti=0;i<mc.Count;i++){textBox2.AppendText(mc[i].Value+"\r\n");//测试数据是否正确输出s1=s1+mc[i].Value;}string[]d=s1.Split(newstring[]{split},StringSplitOptions.RemoveEmptyEntries);for(inti=0;i<d.Length;i++)//将数字存入列表{list1.Add(int.Parse(d[i]));}//测试画图用的数据是否解析正确if(split.Equals("LP4:")){foreach(intminlist1){textBox3.AppendText(m+"\r\n");}}returnlist1;}privatevoidcomboBox1_SelectedIndexChanged(objectsender,EventArgse){}privatevoidcomboBox2_SelectedIndexChanged(objectsender,EventArgse){serialPort1.BaudRate=int.Parse(comboBox2.SelectedItem.ToString());}privatevoidsearchPort(){stringBuffer;comboBox1.Items.Clear();for(inti=1;i<20;i++){try{Buffer="COM"+i.ToString();serialPort1.PortName=Buffer;serialPort1.Open();comboBox1.Items.Add(Buffer);comboBox1.SelectedItem=Buffer;serialPort1.Close();}catch{}}}privatevoidgetDatas(){System.Text.RegularExpressions.Regexr1=newSystem.Text.RegularExpressions.Regex("LP1:(-?)\\d+");System.Text.RegularExpressions.Regexr2=newSystem.Text.RegularExpressions.Regex("LP2:(-?)\\d+");System.Text.RegularExpressions.Regexr3=newSystem.Text.RegularExpressions.Regex("LP3:(-?)\\d+");System.Text.RegularExpressions.Regexr4=newSystem.Text.RegularExpressions.Regex("LP4:(-?)\\d+");System.Text.RegularExpressions.Regexr5=newSystem.Text.RegularExpressions.Regex("LP5:(-?)\\d+");System.Text.RegularExpressions.Regexr6=newSystem.Text.RegularExpressions.Regex("CC1:(-?)\\d+");System.Text.RegularExpressions.Regexr7=newSystem.Text.RegularExpressions.Regex("CC2:(-?)\\d+");System.Text.RegularExpressions.Regexr8=newSystem.Text.RegularExpressions.Regex("CC3:(-?)\\d+");System.Text.RegularExpressions.Regexr9=newSystem.Text.RegularExpressions.Regex("CC4:(-?)\\d+");System.Text.RegularExpressions.Regexr10=newSystem.Text.RegularExpressions.Regex("CC5:(-?)\\d+");byte[]inbuffer=null;//Queue<int>q1=newQueue<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=newbyte[serialPort1.BytesToRead];serialPort1.Read(inbuffer,0,serialPort1.BytesToRead);stringstrRaad=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("停止")){//LP1if(checkBox2.Checked){foreach(intyinDealData(strRaad,r2,"LP2:")){chart1.Series[1].Points.AddXY(DateTime.Now.ToOADate(),y);//count2=count2+5;}}else{chart1.Series[1].Points.Clear();}//LP2if(checkBox2.Checked){foreach(intyinDealData(strRaad,r2,"LP2:")){chart1.Series[1].Points.AddXY(DateTime.Now.ToOADate(),y);//count2=count2+5;}}else{chart1.Series[1].Points.Clear();}//LP3if(checkBox3.Checked){foreach(intyinDealData(strRaad,r3,"LP3:")){chart1.Series[2].Points.AddXY(DateTime.Now.ToOADate(),y);//count3=count3+5;}}else{chart1.Series[2].Points.Clear();}//LP4if(checkBox4.Checked){foreach(intyinDealData(strRaad,r4,"LP4:")){chart1.Series[3].Points.AddXY(DateTime.Now.ToOADate(),y);//count4=count4+5;}}else{chart1.Series[3].Points.Clear();}//LP5if(checkBox5.Checked){foreach(intyinDealData(strRaad,r5,"LP5:")){chart1.Series[4].Points.AddXY(DateTime.Now.ToOADate(),y);//count5=count5+5;}}else{chart1.Series[4].Points.Clear();}//CC1if(checkBox6.Checked){foreach(intyinDealData(strRaad,r6,"CC1:")){chart1.Series[5].Points.AddXY(DateTime.Now.ToOADate(),y);//count6=count6+5;}}else{chart1.Series[5].Points.Clear();}//CC2if(checkBox7.Checked){foreach(intyinDealData(strRaad,r7,"CC2:")){chart1.Series[6].Points.AddXY(DateTime.Now.ToOADate(),y);//count7=count7+5;}}else{chart1.Series[6].Points.Clear();}//CC3if(checkBox8.Checked){foreach(intyinDealData(strRaad,r8,"CC3:")){chart1.Series[7].Points.AddXY(DateTime.Now.ToOADate(),y);//count8=count8+5;}}else{chart1.Series[8].Points.Clear();}//CC4if(checkBox9.Checked){foreach(intyinDealData(strRaad,r9,"CC4:")){chart1.Series[8].Points.AddXY(DateTime.Now.ToOADate(),y);//count9=count9+5;}}else{chart1.Series[8].Points.Clear();}//CC5if(checkBox10.Checked){foreach(intyinDealData(strRaad,r10,"CC5:")){chart1.Series[9].Points.AddXY(DateTime.Now.ToOADate(),y);//count10=count10+5;}}else{chart1.Series[9].Points.Clear();}}}catch{}}}privatevoidbtn_open_Click(objectsender,EventArgse){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("串口打开失败!","错误");}}}privatevoidtimer1_Tick(objectsender,EventArgse){if(!serialPort1.IsOpen){searchPort();}else{}getDatas();}privatevoidbtn_clear_Click(objectsender,EventArgse){textBox1.Clear();}privatevoidbtn_save_Click(objectsender,EventArgse){if(this.textBox1.TextLength>0){stringpath="D:\\log.txt";using(StreamWritersw=newStreamWriter(path,true)){Stringtime=DateTime.Now.ToLocalTime().ToString();sw.WriteLine("\n"+time);sw.Write(this.textBox1.Text);}MessageBox.Show("已保存到D:\\log.txt!");}}privatevoidbtn_start_Click(objectsender,EventArgse){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#实现串口示波器”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。