如何使用C#实现串口示波器
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章主要为大家展示了"如何使用C#实现串口示波器",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何使用C#实现串口示波器"这篇文章吧。具体内容如下开发
千家信息网最后更新 2025年11月16日如何使用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 < 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安全错误
数据库的锁怎样保障安全
access数据库系统封装
商道高手服务器怎么开
1000万数据库缓存查询
hp服务器驱动
龙旗软件开发待遇
武汉数据库工程师招聘
三维点云处理软件开发
中专计算机应用网络技术
移动软件开发的指导文件
ice服务器可以炸图吗
手机做一个服务器
物料和半成品成品数据库
ug许可服务器安装时错误
杭州电商互联网科技
数据库1265什么意思
嘉兴通信网络技术常见问题
iis服务器安装与网站搭建
autocad软件开发商
计算机网络技术课本
平板电脑可以进行软件开发吗
暗黑三拍卖行哪个服务器好
网络安全 红队蓝队
rdp是数据库类型名吗
西奥电梯中文服务器怎么清除故障
开源excel服务器
简述数据库的连接方式
飞创招聘软件开发
深圳直播软件开发服务
重启linux服务器命令
零基础软件测试和软件开发