今年A测相较于去年,增添了上位机部分,但电路图中少了电机的部分。
所以在之前的部分我们都可以参考去年的,然后再加上上位机部分就可以了。上位机相当于封装了去年我们在串口调试工具中查看温度与发送学好的功能。
具体参考这位大佬的文章:2023西电A测:湿度测控仿真系统-CSDN博客
上位机代码的编写:
用C#和QT写都比较方便,这里采用C#。
推荐使用Visual Studio2019,且在安装时选择了相关选项。
创建新项目:
需要注意使windows窗体应用。
创建项目后进入这个界面:
根据题目要求,我们需要一个:ComboBox(串口选择下拉菜单),Button(用于打开/关闭串口),TextBox(用于输入并显示学号),TextBox(用于显示接收到的湿度数据),Button(用于发送学号到 Arduino)这些在左边的工具栏中找到后拖到白板中:
如果因未知原因并没有显示这个工具栏,可以使用Ctrl+Alt+X来打开工具栏。将相应的组件拖到白板中后,注意命名,这将关乎到你在代码中该如何使用它。比如button,单击会显示属性:
在右边的设计中你可以将其改名为OpenOrClose.底部的text将显示一个默认文本:
继续添加需要的组件:
如下是完成之后:
在这里我就不做命名都采用默认名。
接下来我们需要编写一些方法与事件绑定,并进行一些初始化操作。进入Form1.cs
我们需要包含一些必需库并进行一些初始化操作。
需要添加库代码:
using System.IO.Ports;
public partial class Form1 : Form
{
private bool isSerialPortOpen = false; // 跟踪串口状态
private SerialPort serialPort; // 声明串口变量
public Form1()
{
InitializeComponent();
InitializeSerialPort(); // 初始化串口
}
private void InitializeSerialPort()
{
serialPort = new SerialPort
{
PortName = "COM2", // 设置串口号,根据实际情况修改
BaudRate = 9600, // 设置波特率
Parity = Parity.None,
StopBits = StopBits.One,
DataBits = 8,
Handshake = Handshake.None
};
serialPort.DataReceived += SerialPort_DataReceived; // 添加数据接收事件
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPort.ReadLine(); // 读取一行数据
this.Invoke(new Action(() =>
{
textBox2.Text = data; // 将接收到的数据更新到文本框
}));
}
}
我们用的是COM2。并且需要添加一个接收的事件用于接收湿度值。并将其显示在我们刚建立的文本框上。
回到白板,双击白板空白部分:
出现这个方法:
这是窗体加载时执行的代码,我们把添加串口列表的逻辑写在这里。在函数中添加以下代码:
string[] ports = SerialPort.GetPortNames(); // 获取可用串口
comboBox1.Items.AddRange(ports); // 填充串口选择框
回到设计界面,双击选择框:
加入代码:
serialPort.PortName = comboBox1.SelectedItem.ToString(); // 根据选择更新串口号
这里将我们选择的串口显示在框内。
再次回到白板点击第一个按钮:
我们需要定义一个flag值来判断是关闭串口还是打开串口,这个flag在上面已经定义。
if (isSerialPortOpen)
{
serialPort.Close(); // 关闭串口
isSerialPortOpen = false; // 更新状态
button1.Text = "打开串口"; // 更新按钮文本
}
else
{
serialPort.Open(); // 打开串口
isSerialPortOpen = true; // 更新状态
button1.Text = "关闭串口"; // 更新按钮文本
}
接下来编写第二个按钮的方法:
将以下代码复制到方法中:
if (serialPort.IsOpen)
{
string studentId = textBox1.Text; // 获取学号
serialPort.WriteLine(studentId); // 发送学号
}
else
{
MessageBox.Show("串口未打开。");
}
这时候方法就全部写完了。
按照上一篇博客中的方法,全部运行后,将此代码运行,选择端口为com2,在第一个输入框中输入学号,点击发送。需要注意的是你在仿真时,需要关闭打开的那个串口(我们采用的是com2),的调试端,防止出现串口占用无法打开的问题。
如果出现以下错误:
可能是由于你直接复制了别人的代码,但控件的名字对不上,无法对应。你可以忽略并继续,但需要重新添加控件,且注意看你控件的名字,尽量是按照文中的方法来添加代码。
如果你打算使用QT,那么你需要添加QT += serialport这个库。但这个库在6.2.4版本中已经没有了,你可能需要再下载QT更新的版本。
由于我是复制我自己的代码,所以在文中代码可能与你所采用的控件名不同,你需要在调用奈雪儿控件时采用你所取的名字就是在属性中的name中。且如果你想要修改默认显示的文本,这个在属性中的text上修改,修改name并不能直接影响到text.