重新帮我写一个C#上位机程序 可以同时获取9个串口数据,在cartesianChart控件中数据用波形显示,用checkbox勾选串口号可以动态新增和删减串口数据
时间: 2024-02-11 15:03:47 浏览: 176
c# 上位机 数据波形显示 程序
5星 · 资源好评率100%
好的,我了解了你的要求。下面是一个简单的C#上位机程序,可以同时获取9个串口数据,并且在cartesianChart控件中用波形显示。同时,你可以通过选中或取消选中checkbox来动态新增或删除串口数据。
```csharp
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Windows.Forms;
using LiveCharts;
using LiveCharts.Wpf;
namespace SerialDataPlotter
{
public partial class MainForm : Form
{
private readonly Dictionary<string, ChartValues<double>> _dataDict = new Dictionary<string, ChartValues<double>>();
private readonly SerialPort[] _ports = new SerialPort[9];
public MainForm()
{
InitializeComponent();
// 初始化串口
for (var i = 0; i < _ports.Length; i++)
{
_ports[i] = new SerialPort($"COM{i + 1}", 9600);
_ports[i].DataReceived += PortOnDataReceived;
}
// 初始化图表
cartesianChart1.Series = new SeriesCollection();
}
private void MainForm_Load(object sender, EventArgs e)
{
// 添加checkbox控件
for (var i = 0; i < _ports.Length; i++)
{
var checkBox = new CheckBox
{
Text = $"COM{i + 1}",
Tag = _ports[i]
};
checkBox.CheckedChanged += CheckBoxOnCheckedChanged;
flowLayoutPanel1.Controls.Add(checkBox);
}
}
private void PortOnDataReceived(object sender, SerialDataReceivedEventArgs e)
{
var port = (SerialPort) sender;
var data = port.ReadLine().Trim();
Invoke(new MethodInvoker(() =>
{
if (_dataDict.TryGetValue(port.PortName, out var chartValues))
{
chartValues.Add(double.Parse(data));
if (chartValues.Count > 50)
chartValues.RemoveAt(0);
cartesianChart1.Update();
}
}));
}
private void CheckBoxOnCheckedChanged(object sender, EventArgs e)
{
var checkBox = (CheckBox) sender;
var port = (SerialPort) checkBox.Tag;
if (checkBox.Checked)
{
// 添加新的串口数据
var chartValues = new ChartValues<double>();
_dataDict[port.PortName] = chartValues;
cartesianChart1.Series.Add(new LineSeries
{
Title = port.PortName,
Values = chartValues
});
if (!port.IsOpen)
port.Open();
}
else
{
// 删除串口数据
_dataDict.Remove(port.PortName);
foreach (var series in cartesianChart1.Series)
{
if (series.Title == port.PortName)
{
cartesianChart1.Series.Remove(series);
break;
}
}
if (port.IsOpen)
port.Close();
}
}
}
}
```
这个程序使用LiveCharts库来显示波形图。在设计界面中,我们添加了一个cartesianChart控件和一个flowLayoutPanel控件。
在MainForm_Load事件中,我们添加了9个CheckBox控件到flowLayoutPanel中,每个CheckBox控件对应一个串口。当你选中一个CheckBox时,对应的串口数据就会被显示在波形图中。当你取消选中一个CheckBox时,对应的串口数据就会从波形图中移除。
在PortOnDataReceived事件中,我们接收串口数据并将其添加到ChartValues中。我们还在这个事件中使用了Invoke方法,确保UI线程更新图表。
在CheckBoxOnCheckedChanged事件中,我们根据CheckBox的选中状态来添加或删除对应的串口数据。如果选中了一个CheckBox,我们就创建一个ChartValues并将其添加到字典中,同时在波形图中创建一个新的LineSeries。如果取消选中一个CheckBox,我们就从字典中删除对应的ChartValues,并在波形图中删除对应的LineSeries。同时,我们也会打开或关闭对应的串口。
阅读全文