如何使用C#实现串口示波器
发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,这篇文章主要为大家展示了"如何使用C#实现串口示波器",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何使用C#实现串口示波器"这篇文章吧。具体内容如下开发
千家信息网最后更新 2024年11月14日如何使用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安全错误
数据库的锁怎样保障安全
云顶手游选择服务器哪个好
流程再造网络安全管理
常规软件开发特点
投影秀服务器控制软件下载
switch加速连接服务器出错
染色体核型软件开发
服务器一键装机
网络安全ppt图标
学校监控服务器配置推荐
两个数据库怎么联合
黑数据库需要什么技术
社工数据库下载500g
为什么光遇服务器没法玩
数据库基本知识要多长时间学会
民政生存认证怎么登陆服务器出错
服务器当pc机用
net后端数据库技术学习交流
服务器攻击50G多少钱一个小时
我的世界可以开车的服务器
数据库技术 名人
登录系统数据库说明文档
科研数据库是什么
图情专业文摘数据库
网络技术服务指南
龙族幻想换哪个服务器好
阜阳有搞软件开发的吗
linux网络技术特点
工业大数据服务器生产厂家
数据库原理查询选修课程
数据库运用系统的优势