1. 项目背景与核心需求
最近在做一个工业环境监测项目,需要实时采集多个温湿度传感器的数据。市面上的通用数据采集软件要么功能冗余,要么扩展性不足,于是决定用Qt自己撸一个专用上位机。核心需求很明确:稳定采集数据+完整记录历史+简洁可视化。这个需求在农业大棚、实验室监测、仓储管理等场景都很常见。
传感器用的是经典的DHT22,通过RS485转USB接入工控机。通信协议是Modbus RTU,采样频率设定为每分钟一次。上位机需要实现三个核心功能:
- 实时显示当前温湿度数值
- 自动生成带时间戳的数据记录
- 支持数据导出为CSV格式
注意:工业场景下建议选用带校验的通信协议,Modbus RTU的CRC校验能有效避免数据错误
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境搭建
2.1 工具链选择
开发环境采用:
- Qt 5.15.2(LTS版本,长期支持)
- Qt Creator 4.14.0(官方IDE调试方便)
- QCustomPlot 2.1.0(绘图库,GPLv3协议)
- Windows 10 + MSVC2019编译器
选择Qt的原因很实在:
- 跨平台特性:同样的代码可以编译出Win/Linux/macOS版本
- 完善的串口支持:QSerialPort类封装了底层操作
- 信号槽机制:异步处理传感器数据非常方便
cpp复制// pro文件关键配置
QT += core gui serialport printsupport
CONFIG += c++11
2.2 硬件连接测试
先用串口调试工具验证硬件链路:
- 确认波特率(DHT22常用9600bps)
- 测试Modbus功能码(04读输入寄存器)
- 检查寄存器地址(温度0x0000,湿度0x0001)
bash复制# 示例Modbus查询帧(十六进制)
01 04 00 00 00 02 71 CB
# 设备地址 功能码 起始地址 寄存器数量 CRC校验
3. 核心功能实现
3.1 串口通信模块
继承QSerialPort类封装定制功能:
cpp复制class SensorPort : public QSerialPort {
Q_OBJECT
public:
explicit SensorP
