当前位置: 首页 > news >正文

最近在折腾一个温湿度监控项目,用VB配合MSChart控件搞了个实时曲线显示。这玩意儿需要跟下位机通过串口通信,中间踩了不少坑,今天把关键代码拎出来说说

Visual Basic 程序代码,使用MSChart控件,串口读取下位机发来的数据,显示温度湿度,并实时显示曲线,也可以发送指令给温湿度变送器设置参数,代码结构清晰,注释清楚

先上个硬件连接示意图(假装这里有图)。下位机用485转USB接到电脑,通讯协议是自定义的简单格式。重点看软件部分——

串口配置这块儿,用了个Combo控件让用户选端口:

Private Sub Form_Load() For Each sp As String In My.Computer.Ports.SerialPortNames cmbPort.Items.Add(sp) Next With SerialPort1 .BaudRate = 9600 .Parity = Parity.None .DataBits = 8 .StopBits = StopBits.One End With End Sub

这里有个骚操作:My.Computer.Ports.SerialPortNames能自动枚举可用串口,比手动注册表查询方便多了。

数据接收用了个状态机处理,防止数据帧不完整:

Private buffer As String = "" Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim rawData = SerialPort1.ReadExisting() buffer &= rawData '帧头检测 Dim startIndex = buffer.IndexOf("TH:") If startIndex < 0 Then Return '找帧尾 Dim endIndex = buffer.IndexOf(vbCr, startIndex) If endIndex < 0 Then Return '提取有效数据 Dim frame = buffer.Substring(startIndex, endIndex - startIndex) buffer = buffer.Remove(0, endIndex + 1) '清空已处理数据 '解析示例:TH:25.6C,45%RH Dim parts = frame.Split({"C,", "%"}, StringSplitOptions.RemoveEmptyEntries) If parts.Length < 2 Then Return Dim temp = Val(parts(0).Substring(3)) Dim humi = Val(parts(1)) '更新UI要Invoke Me.Invoke(Sub() lblTemp.Text = $"{temp:N1}℃" lblHumi.Text = $"{humi:N1}%" UpdateChart(temp, humi) End Sub) End Sub

注意这里用了Lambda表达式处理跨线程更新,比传统Delegate写法清爽不少。数据解析部分用Split切分字符串,比正则表达式更直观。

曲线更新部分用MSChart的动态数据绑定:

Private Sub UpdateChart(temp As Single, humi As Single) '温度系列是红色曲线 With chartTemp.Series(0) .Points.AddXY(DateTime.Now, temp) If .Points.Count > 100 Then .Points.RemoveAt(0) '保持100个数据点 End With '湿度系列用蓝色虚线 With chartHumi.Series(0) .Points.AddXY(DateTime.Now, humi) .ChartType = DataVisualization.Charting.SeriesChartType.Spline If .Points.Count > 100 Then .Points.RemoveAt(0) End With chartTemp.ChartAreas(0).AxisX.LabelStyle.Format = "HH:mm:ss" chartHumi.ChartAreas(0).RecalculateAxesScale() End Sub

这里两个技巧:1.限制数据点数避免内存暴涨;2.X轴时间格式化显示。MSChart的ChartType属性很关键,Spline类型能让曲线更平滑。

参数下发功能,比如设置采样间隔:

Private Sub btnSetInterval_Click(sender As Object, e As EventArgs) Handles btnSetInterval.Click Dim interval = numInterval.Value Dim cmd = $"SET:INTERVAL={interval}{vbCr}" If SerialPort1.IsOpen Then SerialPort1.Write(cmd) Log($"已发送设置命令: {cmd}") Else MessageBox.Show("请先打开串口!") End If End Sub

实际项目中建议加上校验码,比如CRC16。这里简单用回车符作为帧尾,生产环境可能需要更严谨的协议。

调试时发现MSChart的刷新频率太高会导致界面卡顿,后来在定时器里做了双缓冲处理:

Private Sub tmrRefresh_Tick(sender As Object, e As EventArgs) Handles tmrRefresh.Tick chartTemp.Update() chartHumi.Update() Application.DoEvents() '慎用,但在这小工具里问题不大 End Sub

最后来个提醒:串口操作记得加异常处理!特别是拔插USB转485时容易出幺蛾子,建议在Open/Close时加上Try-Catch块。

http://www.jsqmd.com/news/188642/

相关文章:

  • 理光 210开机报sc559代码故障如何维修
  • 基于Python的电子书籍制作与管理系统开题报告
  • 电动汽车再生制动控制策略模型搭建与分析
  • 【ISP】暗角阴影校正-Radial Shading
  • SLURM: sbatch的hint参数介绍和解释
  • 【AHA三维路径规划】人工蜂鸟算法AHA无人机群航迹协同避障路径规划【含Matlab源码 14817期】
  • 2025必备!10个AI论文写作软件,研究生高效写论文神器!
  • 【A_Star三维路径规划】A_Star算法无人机三维路径规划(含雷达威胁)【含Matlab源码 14816期】
  • Springboot驾校培训管理系统2736g(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 电力系统风储联合一次调频仿真模型附Simulink仿真
  • 全网最全自考必备TOP9 AI论文写作软件测评
  • 具身智能抢人大战:毕业一年,年薪300万元
  • [Linux外设驱动详解]RK3588 平台 U-Boot 环境变量加载机制分析
  • 电力系统短期负荷预测(附Python代码+数据+详细文章讲解)
  • 电容器内部区域的有限元方法(FEM)仿真研究附Matlab代码
  • vue+uniapp+小程序springboot考研学习交流系统 研究生之路-
  • Representation Learning with Contrastive Predictive Coding(InfoNCE)学习
  • 大面额携程任我行礼品卡哪里回收更安心 - 京顺回收
  • 电动汽车电池换电站选址与定容附Matlab代码
  • AI应用架构师案例复盘:金融AI智能体项目延期原因分析——智能化投资决策系统架构设计的教训
  • 还在用老方法写论文?8款AI工具1小时搞定万字!
  • 电动汽车集群并网的分布式鲁棒优化调度模型附Matlab代码
  • GPT-4探索语言的无界领域与AI文本生成技术
  • 电力系统潮流计算及不对称短路分析附Matlab代码
  • 2026年修表店推荐:基于多品牌实测的11家优质售后中心排行榜。 - 十大品牌推荐
  • 实用指南:Linux kill命令与kill函数:从信号原理到实战解析
  • 预测结果汇总 生成时间: 2026-01-03 19:54:38
  • 2026年修表店推荐:聚焦百达翡丽等名表售后案例的11强服务榜单深度对比。 - 十大品牌推荐
  • [Linux外设驱动详解]RK3588 启动地址与链接脚本详解
  • 深入 ‘Runtime Profiling’:监测执行图中每一个节点的内存占用,优化超长对话下的内存泄漏