这几天因为做项目,需要做一个上位机,来接收单片机传过来的数据,并以示波器的形式显示。
语言使用的是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);
}
}
}
嗯,这就是全部内容了,其中单片机传给上位机的数据格式就直接传数字了,没有再写通讯协议。