C#编写上位机示波器(串口接收数据)

时间:2024-03-19 07:22:56

这几天因为做项目,需要做一个上位机,来接收单片机传过来的数据,并以示波器的形式显示。

语言使用的是C#,对于C#我也是初学者,但是对于做这样一个示波器来说,感觉难度也是不大的。

前端界面的设计就如下图所示:

C#编写上位机示波器(串口接收数据)

没错,创建的是一个窗体应用,对于控件,则选择了chart图表控件,button控件,label控件,combobox控件以及timer控件,当然最主要的还是chart控件和Timer控件。

而代码部分如下所示:(一共就这几行。。。)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;  
using System.IO.Ports;




namespace OSC2
{
    public partial class Form1 : Form
    {
        int i = 0;
        byte[] recData;
        SerialPort Spcom = new SerialPort();   //一些必要的初始化部分


        public byte[] RecData { get => recData; set => recData = value; }


        public Form1()
        {
            InitializeComponent();
        }


        private void OSC_Click(object sender, EventArgs e)
        {


        }


        private void Form1_Load(object sender, EventArgs e)
        {
            Chart_Init();                                                        //图标初始化
            Spcom.DataReceived += Spcom_DataReceived;  //串口数据的接收
        }


        private void Spcom_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int length = Spcom.BytesToRead;                      //需要读的字节数的长度
            RecData = new byte[length];                           //把读到的字节数存到RecData这个数组里
            Spcom.Read(RecData, 0, length);                     
        }


        public void Chart_Init()     //图表初始化
        {
            OSC.ChartAreas[0].AxisX.LabelStyle.Format = "d";  //设定X轴的数据格式为整型
            OSC.ChartAreas[0].AxisX.Interval = 5;    //显示间隔为5
            OSC.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside= true;   //设置X轴为滚动模式
            OSC.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
            OSC.ChartAreas[0].AxisX.IsStartedFromZero = true;   //设置X轴坐标为从0开始
            OSC.ChartAreas[0].AxisY.IsStartedFromZero = true;   //设置Y轴坐标为从0开始
            OSC.ChartAreas[0].AxisX.Minimum = 0;       //X轴最小值为0
            OSC.ChartAreas[0].AxisY.Maximum = 5000; //Y轴最大值为5000
        }


        private void timer1_Tick(object sender, EventArgs e)
        {     //一秒产生一次的中断
            if(Spcom.IsOpen)   //如果串口已经打开
            {
                Series series = OSC.Series[0];
                string str = System.Text.Encoding.Default.GetString(RecData);
                int num = Convert.ToInt32(str);
                series.Points.AddXY(i++, num);     //将串口收到的数据显示到示波器界面上
            }
        }




        private void button1_Click(object sender, EventArgs e)
        {    //串口初始化部分
            if (Spcom.IsOpen)
            {
                Spcom.Close();
                button1.Text = "打开串口";
            }
            else
            {
                InitPort();
                try
                {
                    Spcom.Open();
                    button1.Text = "关闭串口";
                    MessageBox.Show("串口初始化成功!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
        public void InitPort()    //串口初始化函数
        {
            Spcom.PortName = cboPortName.Text;
            Spcom.BaudRate = int.Parse(cboBaudRate.Text);
            Spcom.DataBits = int.Parse(cboDataBit.Text);
            Spcom.Parity = (Parity)Enum.Parse(typeof(Parity), cboTest.Text);
            Spcom.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cboStopBit.Text);
        }
    }

}

嗯,这就是全部内容了,其中单片机传给上位机的数据格式就直接传数字了,没有再写通讯协议。