概述
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#上位机(ADC数据显示/波形显示)的全部内容,希望文章能够帮你解决C#上位机(ADC数据显示/波形显示)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复