如何使用C#实现串口示波器
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要为大家展示了"如何使用C#实现串口示波器",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何使用C#实现串口示波器"这篇文章吧。具体内容如下开发
千家信息网最后更新 2025年02月01日如何使用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 ListDealData(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 < 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 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("串口未打开!"); } } } }}
因为第一次开发,所以要实现的功能代码都放在一个类里了,大家将就着看吧
最终实现的效果
以上是"如何使用C#实现串口示波器"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
数据
串口
示波器
C#
内容
效果
篇文章
问题
开发
测试
事件
代码
字符
字符串
工具
控件
窗体
学习
帮助
绘图
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络技术实训室实训计划
机器学习与软件开发技术
买的华为云服务器找不到了
美国网络技术发达的城市
telnet 服务器 打开
普通电脑当数据库服务器
用tsql语句创建数据库
手游方舟为什么服务器刷新不出来
网络安全编程常用算法
在电脑上怎样连接服务器
中医药文献检索数据库
最易学软件开发入门
远程运维服务 主机服务器在哪里
node部署到服务器
简述你身边的网络安全威胁实例
如何让服务器一直开启
怎样学开发软件开发
江苏智铭网络技术有限公司官网
苹果公司6G网络技术
女生从业务it转回软件开发
上海家用软件开发要多少钱
湖南服务器维修调试云空间
9月14日网络安全日
数据存储管理服务器是什么
明日之后苹果手机哪个服务器最多
国产服务器操作系统最好用
上位机视频软件开发
网络安全的中秋节画
简述你身边的网络安全威胁实例
服务器链接不上怎么解决