2026/4/17 9:28:14
网站建设
项目流程
开发个微网站多少钱,html5手机网站制作教程,建设积分网站,微信手机网站搭建用C# WPF写的上位机温湿度读取案例程序#xff0c;走的是modbus rtu协议#xff0c;适合C# WPF学习初学者 赠送录制的#xff0c;超级详细讲解教程
最近在教徒弟写工业上位机#xff0c;撸了个温湿度读取的案例。这个案例用WPF实现界面#xff0c;通过串口走Modbus RTU协…用C# WPF写的上位机温湿度读取案例程序走的是modbus rtu协议适合C# WPF学习初学者 赠送录制的超级详细讲解教程最近在教徒弟写工业上位机撸了个温湿度读取的案例。这个案例用WPF实现界面通过串口走Modbus RTU协议特别适合刚入坑C#工控的小伙伴练手。先上效果主界面实时刷新温湿度数据带超限报警灯历史数据支持Excel导出。教程和源码在文末一、界面就得骚WPF的MVVM模式真香先上XAML布局Grid !-- 实时数据展示 -- Border Style{StaticResource DataBorder} StackPanel TextBlock Text温度 Style{StaticResource TitleStyle}/ TextBlock Text{Binding Temperature} Style{StaticResource ValueStyle}/ TextBlock Text℃ Style{StaticResource UnitStyle}/ /StackPanel /Border !-- 报警指示灯 -- Canvas Ellipse Width20 Height20 Fill{Binding AlarmBrush}/ /Canvas /Grid用样式资源统一管理控件外观数据绑定直接挂钩ViewModel属性。这里有个坑WPF的UI线程不能直接操作串口数据记得用Dispatcher.BeginInvoke做线程调度。二、Modbus RTU协议处理核心代码在ModbusRtuHelper类里看发送请求的部分public byte[] BuildReadRequest(byte slaveId, ushort startAddress, ushort points) { var request new Listbyte { slaveId, // 设备地址 0x03, // 功能码读保持寄存器 (byte)(startAddress 8), (byte)startAddress, // 起始地址 (byte)(points 8), (byte)points // 寄存器数量 }; var crc CalculateCrc(request.ToArray()); request.AddRange(crc); return request.ToArray(); }这里构建的是03功能码请求帧。重点注意寄存器地址是高位在前数值转换时要处理字节序。比如温湿度传感器常用的地址40001对应十六进制0x0000别被设备手册坑了。三、数据解析的骚操作收到设备返回后先做CRC校验private bool ValidateCrc(byte[] data) { var receivedCrc (ushort)((data[^2] 8) | data[^1]); var calculatedCrc CalculateCrc(data[..^2]); return receivedCrc calculatedCrc; }校验通过后解析温度值// 假设返回数据01 03 04 00 79 00 8A CRC float temp (data[3] 8 | data[4]) / 10.0f; // 0x0079 → 121 → 12.1℃ float humidity (data[5] 8 | data[6]) / 10.0f;这里有个细节很多传感器返回的是整型值需要根据手册做小数点位移。比如12.1℃实际传输的是121这个整数记得除10处理。四、避坑指南串口超时设置别用默认值建议ReadTimeout500ms避免界面卡死收到数据先判断长度防止半包/粘包UI刷新用定时器控制频率别傻乎乎每收到数据就刷新设备地址别从0开始试有些厂商默认是1教程里还加了历史曲线绘制、报警记录查询这些进阶功能。想自己动手试试的在【工控小茶馆】后台回复WPF温湿度拿全套源码2小时视频讲解连Modbus调试助手和虚拟串口工具都打包好了。