一、项目概述

本项目是一个基于 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设计等知识点通过一个完整的物联网应用串联起来——从硬件传感器到软件界面,从数据采集到历史分析,涵盖了一个信息系统的完整链路。

• • •

二、技术栈与环境

2.1 开发环境

说明
操作系统Windows
开发工具Microsoft Visual Studio
目标框架.NET Framework 4.7.2
输出类型Windows 应用程序(.exe)

2.2 核心技术栈

技术用途
C#主编程语言
Windows Forms桌面 UI 框架
System.IO.Ports串口通信库
MySql.Data 8.0.33MySQL 数据库连接器
ChartingDataVisualization 图表控件
GB2312中文字符编码
• • •

三、功能模块详解

3.1 串口通信模块

实现计算机与下位机硬件之间的串口数据收发。支持以下可配置参数:

特色功能:定时刷新可用串口(每2秒),支持热插拔;显示模式切换(字符/16进制);自动换行选项;串口状态颜色指示。

3.2 数据接收与解析模块

系统根据接收数据的首字符进行分流处理:

首字符处理方式
>终端日志,显示在 Terminal 面板
#传感器数据,解析后显示在 Screen 面板
其他追加显示在 Terminal 面板

传感器数据格式为固定21字节长度,按位置提取温度、湿度、音量、噪音等级、扬尘浓度和加湿器开关。

3.3 报警功能

当以下条件满足时,系统通过 PC 蜂鸣器发出警报:

警报频率为 2000Hz,持续 500ms。

3.4 数据库连接与配置

通过独立的配置窗体设置数据库连接参数:服务器地址、用户名、密码、数据库名。连接成功后按钮变为绿色,自动加载所有表名到下拉菜单。

3.5 数据自动存储

采用变化检测机制减少冗余写入:

表名存储数据写入触发条件
temp温度值变化 >= 2.0 ℃
humi湿度值变化 >= 5.0 %
sound音量值变化 >= 5.0 DB
level噪音等级任意变化
dust扬尘浓度变化 >= 10.0 μg/m³
ctrl加湿器开关任意变化

3.6 数据查询与可视化

通过 DataGridView 表格展示数据记录,Chart 折线图以时间为 X 轴、数值为 Y 轴绘制变化曲线,支持任意数据库表的通用查询。

3.7 界面布局

主界面分为两个 Tab 页:

鼠标悬停在任何控件上,底部说明栏会显示该控件的功能描述。

• • •

四、核心代码解析

4.1 串口扫描

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秒刷新,实现热插拔检测。

4.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#

4.3 数据库写入(参数化查询)

using (MySqlCommand command = new MySqlCommand(ins_query, dbConnection))
{
    command.Parameters.AddWithValue("@time", time);
    command.Parameters.AddWithValue("@value", value);
    command.ExecuteNonQuery();
}C#

采用参数化查询防止 SQL 注入,根据变化阈值判断是否执行写入。

• • •

五、数据库设计

5.1 数据库结构

数据库名称:noisedust(可在配置中修改)。所有表采用统一的简单结构:

CREATE TABLE temp (
    time DATETIME NOT NULL,
    value DOUBLE NOT NULL
);SQL

5.2 建表 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

这种统一结构的好处是查询通用性强,新增传感器只需建表无需改代码,且图表兼容性好。

• • •

六、数据通信协议

6.1 物理层参数

参数
通信接口RS-232 串口(USB 转串口)
波特率9600 bps
数据位8 位
停止位1 位
校验位None

6.2 传感器数据帧格式

# 开头,固定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.00DB
噪音等级I轻度
扬尘浓度0123μg/m³
加湿器开关0