千家信息网

如何使用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 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安全错误 数据库的锁怎样保障安全 网络技术实训室实训计划 机器学习与软件开发技术 买的华为云服务器找不到了 美国网络技术发达的城市 telnet 服务器 打开 普通电脑当数据库服务器 用tsql语句创建数据库 手游方舟为什么服务器刷新不出来 网络安全编程常用算法 在电脑上怎样连接服务器 中医药文献检索数据库 最易学软件开发入门 远程运维服务 主机服务器在哪里 node部署到服务器 简述你身边的网络安全威胁实例 如何让服务器一直开启 怎样学开发软件开发 江苏智铭网络技术有限公司官网 苹果公司6G网络技术 女生从业务it转回软件开发 上海家用软件开发要多少钱 湖南服务器维修调试云空间 9月14日网络安全日 数据存储管理服务器是什么 明日之后苹果手机哪个服务器最多 国产服务器操作系统最好用 上位机视频软件开发 网络安全的中秋节画 简述你身边的网络安全威胁实例 服务器链接不上怎么解决
0