C#上位机(ADC数据显示/波形显示)

本文档详细介绍了如何通过串口通信获取硬件ADC数据,并在窗体中以进度条和波形的形式展示。内容包括窗体设计、串口事件处理、数据转换及显示,以及从串口读取数据后更新多个进度条或TrackBar控件来模拟波形变化。此外,还涉及了控件的显示和隐藏以及窗体大小的调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简单版(ADC数据显示在进度条上)

硬件链接热敏电阻、电容等。低电平为0x00,高电平为0xFF。

1.1 窗体设计
在这里插入图片描述

上述窗体设计也没什么特殊的,都是平时应用的。

1.2 获取硬件的ADC值,传入上位机,并进行十六进制显示
1.2.1 窗体事件

public Form1()
{
   InitializeComponent();
   //添加串口数据接收事件--可以直接生成,也可以手动输入。
   //this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.PortDataReceivedEvent);

   //为了防止进程之间出错,用到串口必须把检查线程置于关闭
   System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

   //扫描串口信息,为了之后方便使用,此处进行封装一个串口扫描的函数
   SearchAndSerialComboBox(serialPort1, comboBox1);
}

1.2.2 扫描串口事件

private void SearchAndSerialComboBox(SerialPort MyPort, ComboBox MyBox)
{
    //定义一个内存缓存变量
    string Buffer;
    //清空ComboBox下拉控件内容
    MyBox.Items.Clear();
    //遍历20个串口
    for (int i = 1; i < 20; i++)
    {
        //如果运行成功,就将相应的串口信息添加至ComboBox。
        try
        {
            //将读取的串口信息存在内存中
            Buffer = "COM" + i.ToString();
            //将内存中的串口信息给相应的控件
            MyPort.PortName = Buffer;
            //打开串口如果运行失败,后面的代码就不执行了,直接跳转至catch。
            MyPort.Open();
            //将获取的串口添加到ComboBox
            MyBox.Items.Add(Buffer);
            //关闭串口
            MyPort.Close();
        }
        catch
        {
        }
    }
}

1.2.3 打开串口事件

private void button1_Click(object sender, EventArgs e)
{
    if (serialPort1.IsOpen)
    {
        //================串口关闭====================

        //让第二个groupBox2组件不显示
        groupBox2.Visible = false;
        //或者由窗体大小来控制哪个控件不显示。---缩小这里的size是针对于整个窗体而言的。
        //this.Size = new Size(810, 143);
        //串口关闭一般不会有异常,因此不需要try catch
        serialPort1.Close();
        button1.Text = "打开串口";
    }
    else
    { 
        //===============串口打开=====================
        try
        {
            //获取串口号
            serialPort1.PortName = comboBox1.Text;
            //打开串口
            serialPort1.Open();
            //让第二个groupBox2组件显示
            groupBox2.Visible = true;
            //放大
            //this.Size = new Size(810, 275);
            button1.Text = "关闭串口";
        }
        catch (Exception)
        {
            MessageBox.Show("串口打开错误", "错误提示");
            throw;
        }
    }
}

1.今天在串口按钮事件中新加了一个功能,那就是打开串口,groupBox2组件显示,窗体放大。关闭串口groupBox2组件不显示,窗体缩小。
2.显示的函数:public bool Visible { get; set; }
(1)摘要: 获取或设置一个值,该值指示是否显示该控件及其所有子控件。
(2)返回结果: 如果显示该控件及其所有子控件,则为 true;否则为 false。 默认值为 true。
3.窗体放大缩小的函数:public Size Size { get; set; }
(1)摘要: 获取或设置窗体的大小。
(2)返回结果: System.Drawing.Size,它表示窗体的大小。

1.2.4 串口事件

//串口事件
private void PortDataReceivedEvent(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    //读取串口的数据,存入缓冲区中。
    byte Data = (Byte)serialPort1.ReadByte();
    //给进度条赋值
    progressBar1.Value = Data;
    //将缓冲区的数据转化为16进制。
    string str = Data.ToString("x");
    //标准化格式输出数据的值。
    textBox1.Text = "0x" + (str.Length == 1 ? "0" + str : str);
}

这里实现的功能就是将硬件传给串口的数据存入缓冲区,进而控制进度条,和显示数值在textbox中。也没什么难度,之前都有详细介绍过。

1.2.5 运行结果在这里插入图片描述

因为没有硬件,无法验证。

2.通过多个进度条显示ADC数据,进而形成波形,可以查看数据的变化规律

其实设计的原理就是将进度条封装在一个数组中,进而在串口函数中进行遍历赋值操作。

2.1 窗体设计
在这里插入图片描述
2.2 将进度条控件存放在一个数组中,并返回一个对象数组

//将进度条控件存放在一个数组中,并返回一个对象数组。
ProgressBar[] GetProgressBar()
{
    return new ProgressBar[]
    {
     progressBar1,progressBar2,progressBar3,progressBar4,progressBar5,
     progressBar6,progressBar7,progressBar8,progressBar9,progressBar10
    };   
}

在这里插入图片描述

2.3 串口事件

//串口事件
private void PortDataReceivedEvent(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
   //获取进度条数组
   ProgressBar[] MyProgressBar = GetProgressBar();
   //读取串口的数据,存入自己定义的缓冲区data中。
   byte[] Data = new byte[serialPort1.BytesToRead];
   //读串口的缓冲区数据
   serialPort1.Read(Data, 0, Data.Length);
   //遍历数组
   foreach (byte Mydata in Data)
   {
       for (int i = 0; i < 10; i++)//MyProgressBar.Length其实就是10
       {
           //给数组赋值获取的方式,给进度条赋值,获取波形。
           MyProgressBar[10 - i].Value = MyProgressBar[10 - i - 1].Value;
       }
       //将串口数据的值默认给progressBar1控件
       progressBar1.Value = (int)Mydata;
       //将缓冲区的数据转化为16进制。
       string str = Mydata.ToString("x");
       //标准化格式输出数据的值。
       textBox1.Text = "0x" + (str.Length == 1 ? "0" + str : str);
   }
}

在这里插入图片描述

2.4 打开串口按钮事件

//打开串口按钮事件
private void button1_Click(object sender, EventArgs e)
{
    if (serialPort1.IsOpen)
    {
        //================串口关闭====================
        //让第二个groupBox2组件不显示
        groupBox2.Visible = false;
        //设置窗体大小--缩小
        this.Size = new Size(815, 147);
        //串口关闭一般不会有异常,因此不需要try catch
        serialPort1.Close();
        //获取进度条数组
        ProgressBar[] MyProgressBar = GetProgressBar();
        //遍历进度条
        foreach (ProgressBar MyBar in MyProgressBar)
        {
            //关闭串口后,让进度条值归零
            MyBar.Value = 0;
        }
        button1.Text = "打开串口";
    }
    else
    { 
        //===============串口打开=====================
        try
        {
            //获取串口号
            serialPort1.PortName = comboBox1.Text;
            //打开串口
            serialPort1.Open();
            //让第二个groupBox2组件不显示
            groupBox2.Visible = true;
            //设置窗体大小--放大
            this.Size = new Size(815, 549);
            button1.Text = "关闭串口";

        }
        catch (Exception)
        {
            MessageBox.Show("串口打开错误", "错误提示");
            throw;
        }

    }
}

在这里插入图片描述
2.5 运行结果
在这里插入图片描述
3.波形一般都是垂直的,更换控件,即可以达到效果。
3.1 窗体设计
在这里插入图片描述

注意trackBar的最大值设置为255.一个字节大小就可以。

3.2 将trackBar控件存放在一个数组中,并返回一个对象数组

//将TrackBar控件存放在一个数组中,并返回一个对象数组。
TrackBar[] GetTrackBar()
{
    return new TrackBar[]
    {trackBar1,trackBar2,trackBar3,trackBar4,trackBar5,
     trackBar6,trackBar7,trackBar8,trackBar9,trackBar10
    };   
}

在这里插入图片描述
3.3 串口事件

private void PortDataReceivedEvent(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
   //获取进度条数组
   TrackBar[] MyTrackBar = GetTrackBar();
   //读取串口的数据,存入自己定义的缓冲区data中。
   byte[] Data = new byte[serialPort1.BytesToRead];
   //读串口的缓冲区数据
   serialPort1.Read(Data, 0, Data.Length);
   //遍历数组
   foreach (byte Mydata in Data)
   {
       for (int i = 0; i < 10; i++)//MyProgressBar.Length其实就是10
       {
           //给数组赋值获取的方式,给进度条赋值,获取波形。
           MyTrackBar[10 - i].Value = MyTrackBar[10 - i - 1].Value;
       }
       //将串口数据的值默认给progressBar1控件
       trackBar1.Value = (int)Mydata;
       //将缓冲区的数据转化为16进制。
       string str = Mydata.ToString("x");
       //标准化格式输出数据的值。
       textBox1.Text = "0x" + (str.Length == 1 ? "0" + str : str);
   }
}

3.4 打开串口按钮事件

//打开串口按钮事件
private void button1_Click(object sender, EventArgs e)
{
    if (serialPort1.IsOpen)
    {
        //================串口关闭====================
        //让第二个groupBox2组件不显示
        groupBox2.Visible = false;
        //设置窗体大小--缩小
        this.Size = new Size(815, 147);
        //串口关闭一般不会有异常,因此不需要try catch
        serialPort1.Close();
        //获取进度条数组
        TrackBar[] MyTrackBar = GetTrackBar();
        //遍历进度条
        foreach (TrackBar MyBar in MyTrackBar)
        {
            //关闭串口后,让进度条值归零
            MyBar.Value = 0;
        }
        button1.Text = "打开串口";
    }
    else
    { 
        //===============串口打开=====================
        try
        {
            //获取串口号
            serialPort1.PortName = comboBox1.Text;
            //打开串口
            serialPort1.Open();
            //让第二个groupBox2组件不显示
            groupBox2.Visible = true;
            //设置窗体大小--放大
            this.Size = new Size(815, 549);
            button1.Text = "关闭串口";

        }
        catch (Exception)
        {
            MessageBox.Show("串口打开错误", "错误提示");
            throw;
        }

    }
}

进度条事件和trackBar控件,只需要修该控件名称即可。

3.5 运行结果
在这里插入图片描述

基于C#波形显示控件的实现源码 计算机技术的飞速发展使得其在自动化系统中的应用日益增强。大量监控、图像数据显示软件活跃在自动化工业及自动化教学领域。同时,软件系统的日益复杂化使得模块化开发变得尤为重要。本课题所设计的基于C#波形显示控件就可在微软.NET平台下进行代码功能重用,达到模块化开发和快速开发的目的,使得程序员能够集中精力设计软件的具体业务流程,而不必担心波形呈现的问题。 本文先介绍了.NET平台下用户控件开发的基本方法,以及用C#描述的GDI+图形开发技术,然后提出一种基于C#波形显示控件的设计思路,并对波形坐标值转换、坐标标尺、工具栏、局部放大等具体的设计细节进行详细解析。 本课题设计的波形显示控件实现了同时显示多条数据曲线、局部放大查看、波形显示自动调整最佳坐标范围、动态显示波形等功能。创新之处在于设计了一种方法,使得波形显示控件的坐标轴的起点值和终点值能够以浮点数显示,并自动根据当前波形显示控件的大小,描绘出符合用户视觉的坐标标尺。 波形显示控件实现的功能 (1) 多条波形数据显示。 该波形显示控件能够同时显示多条波形数据,用户能够控制每条波形数据显示颜色、线宽、线帽、以及线转折的样式。并且提供了三种波形数据显示的方式:连续数据线、离散点、条形图。 (2) 友好坐标标尺的显示。 该波形显示控件能够根据当前显示数据的坐标范围,友好地显示坐标标尺。例如X轴坐标起始值为34.2,结束坐标值为100.7,则控件不是简单得将坐标10等分并显示并不友好的坐标值,而是通过计算当前波形显示控件的大小,显示40、50……这样的友好的坐标值,并判断是否需要继续在40到50的坐标值之间显示更小分度的坐标值。 (3) 波形显示区域网格的显示。 该波形显示控件可以显示同坐标标尺的坐标线相对应的网格,使得用户能够更直观地观察波形数据。 (4) 波形的局部放大。 该波形显示控件提供了波形局部放大的功能。并根据实际使用和测试,控制了波形放大的精度,以免产生数据溢出的问题。 (5) 坐标自动调整。 该波形显示控件能够根据当前要显示波形数据的值,自动选择最佳的坐标范围,来直观地在控件的波形显示区域显示完整的波形曲线。 (6) 外观颜色方案的修改。 该波形显示控件能够修改外观样式,诸如背景色、网格颜色、坐标线颜色、坐标值颜色等都可以进行调整,以使控件外观能够符合软件整体风格。 (7) 其他细节。 该波形显示控件还设计了一个工具栏,可以方面地使用网格显示、局部放大、坐标自动调整、恢复默认坐标功能。另外还设计右键菜单,能够显示当前鼠标位置的具体坐标值,以及工具栏按钮的快捷按钮。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值