本项目是一个基于 C# 和 .NET Framework 4.7.2 平台开发的 Windows Forms 串口通信桌面应用程序。系统通过计算机串口与下位机硬件设备进行通信,实时采集并处理串口数据,可应用于工地噪音扬尘检测、环境监测等多种场景。支持温度、湿度、音量(噪声)、噪音等级、扬尘浓度以及加湿器开关状态等数据接收。
同时集成了 MySQL 数据库功能,能够将采集到的环境数据自动存储到数据库中,并提供历史数据查询和可视化图表展示功能。
| 参数 | 值 |
|---|---|
| 开发工具 | Visual Studio |
| 目标框架 | .NET Framework 4.7.2 |
| 界面框架 | Windows Forms(WinForm) |
| 串口通信 | System.IO.Ports.SerialPort |
| 数据库 | MySQL(MySql.Data 8.0.33) |
| 数据可视化 | System.Windows.Forms.DataVisualization.Charting |
| 编码格式 | GB2312(兼容中文字符) |
| 通信接口 | RS-232 串口(USB 转串口) |
这个项目的初衷是将串口编程、数据库操作、UI设计等知识点通过一个完整的物联网应用串联起来——从硬件传感器到软件界面,从数据采集到历史分析,涵盖了一个信息系统的完整链路。
| 项 | 说明 |
|---|---|
| 操作系统 | Windows |
| 开发工具 | Microsoft Visual Studio |
| 目标框架 | .NET Framework 4.7.2 |
| 输出类型 | Windows 应用程序(.exe) |
| 技术 | 用途 |
|---|---|
| C# | 主编程语言 |
| Windows Forms | 桌面 UI 框架 |
| System.IO.Ports | 串口通信库 |
| MySql.Data 8.0.33 | MySQL 数据库连接器 |
| Charting | DataVisualization 图表控件 |
| GB2312 | 中文字符编码 |
实现计算机与下位机硬件之间的串口数据收发。支持以下可配置参数:
特色功能:定时刷新可用串口(每2秒),支持热插拔;显示模式切换(字符/16进制);自动换行选项;串口状态颜色指示。
系统根据接收数据的首字符进行分流处理:
| 首字符 | 处理方式 |
|---|---|
> | 终端日志,显示在 Terminal 面板 |
# | 传感器数据,解析后显示在 Screen 面板 |
| 其他 | 追加显示在 Terminal 面板 |
传感器数据格式为固定21字节长度,按位置提取温度、湿度、音量、噪音等级、扬尘浓度和加湿器开关。
当以下条件满足时,系统通过 PC 蜂鸣器发出警报:
警报频率为 2000Hz,持续 500ms。
通过独立的配置窗体设置数据库连接参数:服务器地址、用户名、密码、数据库名。连接成功后按钮变为绿色,自动加载所有表名到下拉菜单。
采用变化检测机制减少冗余写入:
| 表名 | 存储数据 | 写入触发条件 |
|---|---|---|
| temp | 温度值 | 变化 >= 2.0 ℃ |
| humi | 湿度值 | 变化 >= 5.0 % |
| sound | 音量值 | 变化 >= 5.0 DB |
| level | 噪音等级 | 任意变化 |
| dust | 扬尘浓度 | 变化 >= 10.0 μg/m³ |
| ctrl | 加湿器开关 | 任意变化 |
通过 DataGridView 表格展示数据记录,Chart 折线图以时间为 X 轴、数值为 Y 轴绘制变化曲线,支持任意数据库表的通用查询。
主界面分为两个 Tab 页:
鼠标悬停在任何控件上,底部说明栏会显示该控件的功能描述。
private void Updata_Serialport_Name(ComboBox MycomboBox)
{
string[] ArryPort = SerialPort.GetPortNames();
MycomboBox.Items.Clear();
for (int i = 0; i < ArryPort.Length; i++)
MycomboBox.Items.Add(ArryPort[i]);
}C#
通过 SerialPort.GetPortNames() 获取系统可用串口列表,定时器每2秒刷新,实现热插拔检测。
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPort1.ReadExisting();
if (data.StartsWith("#") && data.Length == 21)
{
// 解析传感器数据
string temp = data.Substring(1, 4); // 温度
string humi = data.Substring(5, 4); // 湿度
string sound = data.Substring(9, 4); // 音量
string level = data.Substring(13, 3); // 噪音等级
string dust = data.Substring(16, 4); // 扬尘浓度
string ctrl = data.Substring(20, 1); // 加湿器开关
// 更新 UI 显示...
}
else if (data.StartsWith(">"))
{
// 追加到 Terminal 终端
}
}C#
using (MySqlCommand command = new MySqlCommand(ins_query, dbConnection))
{
command.Parameters.AddWithValue("@time", time);
command.Parameters.AddWithValue("@value", value);
command.ExecuteNonQuery();
}C#
采用参数化查询防止 SQL 注入,根据变化阈值判断是否执行写入。
数据库名称:noisedust(可在配置中修改)。所有表采用统一的简单结构:
CREATE TABLE temp (
time DATETIME NOT NULL,
value DOUBLE NOT NULL
);SQL
CREATE DATABASE noisedust;
USE noisedust;
CREATE TABLE temp (time DATETIME, value DOUBLE);
CREATE TABLE humi (time DATETIME, value DOUBLE);
CREATE TABLE sound (time DATETIME, value DOUBLE);
CREATE TABLE level (time DATETIME, value DOUBLE);
CREATE TABLE dust (time DATETIME, value DOUBLE);
CREATE TABLE ctrl (time DATETIME, value DOUBLE);SQL
这种统一结构的好处是查询通用性强,新增传感器只需建表无需改代码,且图表兼容性好。
| 参数 | 值 |
|---|---|
| 通信接口 | RS-232 串口(USB 转串口) |
| 波特率 | 9600 bps |
| 数据位 | 8 位 |
| 停止位 | 1 位 |
| 校验位 | None |
以 # 开头,固定21字节:
# T1 T2 T3 T4 H1 H2 H3 H4 S1 S2 S3 S4 L1 L2 L3 D1 D2 D3 D4 C
│ ───温度─── ───湿度─── ───音量─── ─等级─ ───扬尘─── 开关
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20格式
示例解析——接收数据 #253060007500I01230:
| 字段 | 值 | 说明 |
|---|---|---|
| 温度 | 25.30 | ℃ |
| 湿度 | 60.00 | % |
| 音量 | 75.00 | DB |
| 噪音等级 | I | 轻度 |
| 扬尘浓度 | 0123 | μg/m³ |
| 加湿器开关 | 0 | 关 |