返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#实现串口示波器
  • 439
分享到

C#实现串口示波器

2024-04-02 19:04:59 439人浏览 安东尼
摘要

本文实例为大家分享了C#实现串口示波器的具体代码,供大家参考,具体内容如下 开发工具 visual studio2019 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<int> DealData(string datas, Regex r, string split) 
        {
            if (string.IsNullOrEmpty(datas))
            {
                throw new ArgumentException($"“{nameof(datas)}”不能是 Null 或为空。", nameof(datas));
            }
           
            List<int> list1=new List<int> { };
            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<d.Length;i++)            //将数字存入列表
            {
                list1.Add( int.Parse(d[i]));
            }

            //测试画图用的数据是否解析正确
            if (split.Equals("LP4:"))
            {
                foreach (int m in list1)
                {
                    textBox3.AppendText(m + "\r\n");
                }
            }
            return list1;
        } 

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            
                serialPort1.BaudRate = int.Parse(comboBox2.SelectedItem.ToString());
        }

        private void searchPort()
        {
            string Buffer;
            comboBox1.Items.Clear();
            for (int i = 1; i < 20; i++)
            {
                try
                {
                    Buffer = "COM" + i.ToString();
                    serialPort1.PortName = Buffer;
                    serialPort1.Open();
                    comboBox1.Items.Add(Buffer);
                    comboBox1.SelectedItem = Buffer;
                    serialPort1.Close();
                }
                catch
                { }
            }
        }
        private void getDatas() 
        {
            System.Text.RegularExpressions.Regex r1 = new System.Text.RegularExpressions.Regex("LP1:(-?)\\d+");
            System.Text.RegularExpressions.Regex r2 = new System.Text.RegularExpressions.Regex("LP2:(-?)\\d+");
            System.Text.RegularExpressions.Regex r3 = new System.Text.RegularExpressions.Regex("LP3:(-?)\\d+");
            System.Text.RegularExpressions.Regex r4 = new System.Text.RegularExpressions.Regex("LP4:(-?)\\d+");
            System.Text.RegularExpressions.Regex r5 = new System.Text.RegularExpressions.Regex("LP5:(-?)\\d+");
            System.Text.RegularExpressions.Regex r6 = new System.Text.RegularExpressions.Regex("CC1:(-?)\\d+");
            System.Text.RegularExpressions.Regex r7 = new System.Text.RegularExpressions.Regex("CC2:(-?)\\d+");
            System.Text.RegularExpressions.Regex r8 = new System.Text.RegularExpressions.Regex("CC3:(-?)\\d+");
            System.Text.RegularExpressions.Regex r9 = new System.Text.RegularExpressions.Regex("CC4:(-?)\\d+");
            System.Text.RegularExpressions.Regex r10 = new System.Text.RegularExpressions.Regex("CC5:(-?)\\d+");

            byte[] inbuffer = null;

            //Queue<int> q1 = new Queue<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 = 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("串口未打开!");
                }
            }
        }
    }
}

因为第一次开发,所以要实现的功能代码都放在一个类里了,大家将就着看吧

最终实现的效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#实现串口示波器

本文链接: https://lsjlt.com/news/139524.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#实现串口示波器
    本文实例为大家分享了C#实现串口示波器的具体代码,供大家参考,具体内容如下 开发工具 visual studio2019 C#串口示波器,实时刷新端口号,动态绘制多条折线,获取串口数...
    99+
    2024-04-02
  • 如何使用C#实现串口示波器
    这篇文章主要为大家展示了“如何使用C#实现串口示波器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C#实现串口示波器”这篇文章吧。具体内容如下开发工具visual studio2019C...
    99+
    2023-06-29
  • 基于PyQt5实现一个串口接数据波形显示工具
    目录工具简述主程序代码Qt Designer设计UI界面程序运行效果工具简述 基于PyQt5开发UI界面使用QtDesigner设计,需要使用到serial模块(串口库)和pyqtg...
    99+
    2023-01-14
    PyQt5数据波形显示工具 PyQt5数据波形显示 PyQt5数据波形
  • c#模拟串口通信SerialPort的实现示例
    目录一、前导知识实现串口通信的必要设置二、实验绘制窗口测试 三、总结四、附件完整代码一、前导知识 串行口是计算机的标准接口,现在的PC机(个人电脑)一般至少有两个串行口CO...
    99+
    2024-04-02
  • C++实现中值滤波的示例代码
    目录冒泡排序实现:中值滤波的实现:为了加深对中值滤波算法的理解以及方便以后更好的复习,我将该算法的一些重点细节和实现过程踩过的坑记录下来。 中值滤波器是一种非线性滤波器,或者叫统计排...
    99+
    2024-04-02
  • 基于C#实现串口通信
    本文实例为大家分享了C#实现串口通信的具体代码,供大家参考,具体内容如下 1.基本概念 2.前端winForm布局如下(仅仅为了实现功能,布局略丑) 3.代码实现如下 names...
    99+
    2024-04-02
  • C#实现简单串口通信
    串口通信(Serial Communications)是指外设和计算机间通过数据信号线、地线等按位(bit)进行传输数据的一种通信方式,属于串行通信方式,能够实现远距离通信,长度可达...
    99+
    2024-04-02
  • C#如何实现串口通信
    这篇文章主要讲解了“C#如何实现串口通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现串口通信”吧!1.基本概念2.前端winForm布局如下(仅仅为了实现功能,布局略丑)3.代...
    99+
    2023-06-29
  • C#实现串口调试工具
    前文 由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个RtsEnable设置, 折腾半天, 网上各种版本的也很多, 功能扩展的很开也多。所以现在...
    99+
    2024-04-02
  • C#怎么实现串口通信
    本篇内容介绍了“C#怎么实现串口通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!框架准备出于简单考虑,首先创建一个Winform项目,本文...
    99+
    2023-07-05
  • C#实现简单串口通讯实例
    本文实例为大家分享了C#实现简单串口通讯的具体代码,供大家参考,具体内容如下 参数设置界面代码: using System; using System.Collections.Gen...
    99+
    2024-04-02
  • C#基于WinForm实现串口通讯
    串口通讯是一种计算机常用的数据传输方式。 程序运行如下: 首先,检查计算机的串口,并获取所有串口信息。 private void CheckPort()//检查串口是否可用    ...
    99+
    2024-04-02
  • c# 实现简单的串口通讯
    目录开发环境:第一步第二步第三步本文提供一个用C#实现串口通讯实例,亲自编写,亲测可用! 开发环境: VS2008+.net FrameWork3.5(实际上2.0应该也可以) 第一...
    99+
    2024-04-02
  • C#串口接收程序的实现
    1.代码 using System; using System.Collections.Generic; using System.ComponentModel; using Sys...
    99+
    2024-04-02
  • C#中怎么实现监听串口
    C#中怎么实现监听串口,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#串口监听的实现在 Visual Stdio 2005中,对于串口操作Framework提...
    99+
    2023-06-17
  • C语言实现wave波形
    题目描述 一个n列的网格,从(0,0)网格点出发,波形存在平波(从(x,y)到(x+1,y)),上升波(从(x,y)到(x+1,y+1)),下降波(从(x,y)到(x+1,y−1))...
    99+
    2024-04-02
  • C++实现LeetCode(76.最小窗口子串)
    [LeetCode] 76. Minimum Window Substring 最小窗口子串 Given a string S and a string T, find the mi...
    99+
    2024-04-02
  • C#怎么实现简单串口通讯
    本篇内容主要讲解“C#怎么实现简单串口通讯”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么实现简单串口通讯”吧!参数设置界面代码:using System;using ...
    99+
    2023-06-29
  • C#如何实现串口调试工具
    C#如何实现串口调试工具,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前文由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个...
    99+
    2023-06-29
  • 5分钟用C#实现串口助手
    目录第一步,创建新项目,选择Windows窗体应用第二步,点击工具箱,拖拽控件,搭建一下页面第三步,拖入serial port控件,并添加回调函数第四步,实现按钮功能非常简单的扩展框...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作