news 2026/9/12 19:40:45

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
最近在折腾一个温湿度监控项目,用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块。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 9:11:51

Cassandra CQL 完全指南:大数据查询语言详解

Cassandra CQL 完全指南&#xff1a;大数据查询语言详解 关键词&#xff1a;Cassandra、CQL、大数据查询、分布式数据库、数据建模、NoSQL、高并发存储 摘要&#xff1a;本文将带你从零开始认识 Cassandra 的查询语言 CQL&#xff08;Cassandra Query Language&#xff09;。我…

作者头像 李华
网站建设 2026/9/10 20:01:35

单相动态电压恢复器补偿电压凹陷或过电压研究附Simulink仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/9/10 10:38:27

Compose笔记(六十六)--ModalNavigationDrawer

这一节主要了解一下Compose中的ModalNavigationDrawer,在Jetpack Compose开发中&#xff0c;ModalNavigationDrawer是一个用于实现模态导航抽屉的核心组件&#xff0c;它允许用户通过侧滑手势或点击菜单图标触发一个覆盖在主内容之上的抽屉菜单&#xff0c;提供页面切换、功能导…

作者头像 李华
网站建设 2026/9/2 22:06:49

反激变换器与Buck - boost电路:电力变换的奇妙世界

反激变换器 - Buck-boost电路 在电力电子领域&#xff0c;反激变换器和Buck - boost电路就像两颗璀璨的明星&#xff0c;各自闪耀着独特的光芒&#xff0c;为我们实现各种电源转换需求立下汗马功劳。今天咱们就一起深入这两个神奇电路的世界&#xff0c;探索它们的奥秘。 Buc…

作者头像 李华
网站建设 2026/9/5 0:39:50

继DeepSeek后,量化巨头九坤推40B开源硬刚Claude 4.5,实测结果却反转

00. 引言 说实话&#xff0c;这两年追开源模型&#xff0c;我的心态已经从最初的“卧槽牛逼”变成了现在的“审美疲劳”。 每周都有新模型号称“拳打GPT&#xff0c;脚踢Claude”&#xff0c;结果实测&#xff0c;翻车的不少。但就在昨天&#xff0c;我在刷推特(X)的时候&…

作者头像 李华