2026/4/18 11:07:54
网站建设
项目流程
会展网站的建设情况,腾讯企点客户通,做互联网推广的公司,网站被抄袭怎么投诉Visual Basic 程序代码#xff0c;使用MSChart控件#xff0c;串口读取下位机发来的数据#xff0c;显示温度湿度#xff0c;并实时显示曲线#xff0c;也可以发送指令给温湿度变送器设置参数#xff0c;代码结构清晰#xff0c;注释清楚先上个硬件连接示意图#xff0…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块。