上一次我们讲到了多点温度采集系统的设计,为此,特意开发了一个上位机用于显示温度,这一节就是来说一下上位机的开发。
当然,目前来说由于水平有限,这个上位机的功能比较简单,只是可以实时显示三路的温度信息,日后再去完善它。
先来看一下它的界面:
来简单介绍一下它的功能:
1、最重要的,能够实时显示温度信息。这里增加了两种显示格式,一种十进制,一种十六进制。十六进制主要是在调试中会使用,这里有些鸡肋。
2、当温度超过一定值(这里设置为40)时,会弹出提示框报警。
3、当超过一定时间(这里设置为5s)没有接收到数据时,弹出提示框报警,下一次如果需要接收数据,必须先点击刷新按钮。
下面简单说一下它的开发流程。省略一些初始的步骤,可以参考之前写的文章:使用C#开发第一个应用程序
开发平台:Microsoft visual studio 2019
开发语言:c#
(1)选择好使用到的控件
本次使用到的控件主要有:
按钮:button
下拉框:ComboBox
单选框:radio button
文本:label
串口:serial port
定时器:timer
(2)设置属性
主要是设置各个控件的初始值之类的。比如刚启动软件时下拉框的值是多少,单选框选的是哪个,文本显示什么,串口的串口号和波特率,定时器定时间隔这些,都可以在控件的属性里面设置。
(3)编写代码
最核心的部分就是要从串口那里读出数据,然后把它放在label文本处,里面有一些细节,比如数字与字符串之间的转化,十进制与十六进制的转化,串口号那里采用了扫描的方式,可以自动扫描出有用的串口。另外还设计了当5s之内没有收到数据就弹出提示框发出警告,这个是靠定时器做到的。
这里就简要介绍一下核心部分,其他的细节就不多说了。
a、串口读出数据,并且显示
data = (byte)serialPort1.ReadByte();//字符串方式读
b、区分不同采样点的信号来显示
这里是通过一次连发两个字节来实现的,第一个字节用来标记是哪一路信号,第二个字节是真正的温度数据。
if (data == 0x03)
{
data = (byte)serialPort1.ReadByte();//字符串方式读
if(data>40)
{
System.Media.SystemSounds.Asterisk.Play();//发出警告声音
MessageBox.Show("温度太高了!!!", "警告!!");//弹出提示框
}
string str = Convert.ToString(data, 10);
label4.Text = str + "℃";
}
c、当一定时间未检测到数据,弹出提示框
private void timer1_Tick(object sender, EventArgs e)
{
count++;
if(count>=50) //定时5s钟
{
count = 0;
label4.Text = "--";
label5.Text = "--";
label6.Text = "--";
timer1.Stop();
System.Media.SystemSounds.Asterisk.Play();//发出警告声音
MessageBox.Show("温度接收不正常!!!", "警告!!");//弹出提示框
}
}
这是通过定时器来实现的,定时器每隔100ms进入定时器事件,然后在定时器事件函数里面对count值加1,当加到50,即5s钟时,就弹出提示框,并且关掉定时器。另外在串口接收事件里,只要接收到新数据,就对count值清0,这样就可以实现要求了。另外还需要注意的就是在计时到了之后,要关掉定时器,否则一直计时,可能会出现下面这种bug
关掉定时器就可以解决这个问题,但是这会带来另一个问题,那就是定时器关了,那么这个功能不就没了吗?所以必须要在合适的时候再开启定时器,本来是希望在串口接收事件里面打开定时器的,但是发现没有用,于是,就单独设计一个刷新按钮,用来打开定时器。
在定时器关了之后,必须要点击刷新按钮,才有数据显示,否则不显示,这样有一个好处就是,如果没有设计这个功能,那么当你长时间没有收到新的数据的时候,它上面还保留着上一次显示的内容,这会给人带来误会,而加上这个功能,则保证了显示的数据是最新接收到的。
另外还有串口扫描功能,实现的思路也就是在初始化的时候去挨个试能打开的串口,如果能打开就把串口号显示一下,之后再关闭,否则不显示,这样显示出来的就是当前可用的串口。
其他的细节就自己注意一下就行了。以后关于上位机的介绍也是只介绍最核心的部分,其他的细节就不多说了。
后台回复“温度采集系统上位机”获取源码