1. 项目概述与核心需求
最近在帮朋友工厂做设备监控系统时,遇到了温湿度数据采集的需求。市面上常见的DHT11、SHT4x等传感器,通信方式无非就是串口直接读取或Modbus协议两种。作为有十年工控经验的C#开发者,我决定把这次实战中的完整方案和踩坑经验整理出来。
这个项目要解决的核心问题是:如何用C#开发稳定可靠的上位机程序,通过串口或Modbus协议实时采集温湿度数据。难点不在于基础通信,而在于工业现场的实际稳定性处理——比如如何应对传感器断线、数据跳变、通信延迟等异常情况。下面我会从硬件选型开始,逐步拆解两种通信方案的完整实现。
提示:工业级应用必须考虑线程安全、异常处理和日志记录,这是区别于教学Demo的关键
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件准备与环境搭建
2.1 传感器选型对比
根据项目预算和精度要求,我测试了三种典型传感器:
| 型号 | 通信方式 | 精度范围 | 价格 | 适用场景 |
|---|---|---|---|---|
| DHT11 | 单总线 | ±2℃/±5%RH | ¥5-10 | 教学、简单监测 |
| SHT30 | I2C/串口 | ±0.2℃/±2%RH | ¥50-80 | 工业常规应用 |
| Modbus温变 | RS485 | ±0.1℃/±1.5%RH | ¥200+ | 高精度工业现场 |
最终选择SHT30+RS485模块的方案,既满足精度要求又兼容Modbus协议。注意:DHT11虽然便宜但稳定性差,工业现场慎用。
2.2 开发环境配置
必备组件清单:
- Visual Studio 2022(社区版即可)
- .NET 6+环境
- NModbus NuGet包(Modbus方案需要)
- SerialPortStream库(解决原生SerialPort的BUG)
关键配置步骤:
bash复制# 安装必要NuGet包
Install-Package NModbus
Install-Package SerialPortStream
踩坑记录:System.IO.Ports.SerialPort在长时间运行时会出现内存泄漏,必须用SerialPortStream替代
3. 串口直连方案实现
3.1 串口通信基础配置
以CH340 USB转串口模块为例,核心参数设置:
csharp复制var port = new SerialPortStream("COM3", 9600, 8, Parity.None, StopBits.One)
{
ReadTimeout = 500,
WriteTimeout = 500,
Handshake = Handshake.None
};
关键参数说明:
- 波特率:必须与传感器说明书一致(常见9600/115200)
- 数据位:温湿度传感器通常为8位
- 停止位:工业设备多用1位停止位
- 超时设置:建议500-1000ms,避免线程阻塞
3.2 数据帧解析实战
以SHT30为例,读取温湿度的命令帧为:
code复制发送:0x23 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
