串口上位机chart
时间: 2025-04-24 10:05:03 浏览: 17
### 关于串口上位机中使用 Chart 控件
#### 创建项目并添加必要的命名空间
为了在 C# 中构建一个可以接收来自串口的数据并通过 `Chart` 控件展示这些数据的应用程序,首先需要创建一个新的 Windows Forms 应用程序。接着,在窗体设计器中拖拽 `Chart` 和其他所需的控件到窗体上。
```csharp
using System;
using System.Windows.Forms;
using System.IO.Ports; // 用于串口通信
using System.Threading.Tasks;
using System.Collections.Generic;
namespace SerialMonitorApp {
public partial class MainForm : Form {
private List<float> temperatureData = new List<float>();
private List<float> humidityData = new List<float>();
private SerialPort serialPort;
public MainForm() {
InitializeComponent();
InitializeSerialPort(); // 初始化串口设置
chartTemperature.Series["Temp"].Points.Clear();
chartHumidity.Series["Humi"].Points.Clear();
Task.Run(() => ReadFromSerial()); // 启动后台线程监听串口消息
}
private void InitializeSerialPort(){
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports){
comboBoxPorts.Items.Add(port);
}
if(comboBoxPorts.Items.Count > 0){
comboBoxPorts.SelectedIndex = 0;
}
serialPort = new SerialPort{
PortName = comboBoxPorts.SelectedItem.ToString(),
BaudRate = 9600,
Parity = Parity.None,
DataBits = 8,
StopBits = StopBits.One,
Handshake = Handshake.None,
Encoding = System.Text.Encoding.Default
};
try{
serialPort.Open();
}catch(Exception ex){
MessageBox.Show($"Error opening serial port: {ex.Message}");
}
}
private async void ReadFromSerial(){
while(true){
if(serialPort.IsOpen && !serialPort.ReadExisting().Equals("")){
var dataReceivedEventArgs = await Task<SerialDataReceivedEventArgs>.Factory.StartNew(
() => {
Thread.Sleep(1); // 防止过快读取导致丢失部分字符
return null;
});
string receivedString = serialPort.ReadLine();
ProcessIncomingData(receivedString.Trim());
}
await Task.Delay(50);
}
}
private void ProcessIncomingData(string rawData){
Invoke((MethodInvoker)delegate {
string[] splitValues = rawData.Split(',');
float tempValue, humiValue;
bool isTempValid = float.TryParse(splitValues[0], out tempValue);
bool isHumiValid = float.TryParse(splitValues[1], out humiValue);
if(isTempValid && isHumiValid){
UpdateCharts(tempValue, humiValue);
}
});
}
private void UpdateCharts(float temp, float humi){
temperatureData.Insert(0,temp);
humidityData.Insert(0,humi);
if(temperatureData.Count >= 20 || humidityData.Count >= 20){
temperatureData.RemoveAt(temperatureData.Count - 1);
humidityData.RemoveAt(humidityData.Count - 1);
}
for(int i=0;i<Math.Min(temperatureData.Count, humidityData.Count);++i){
chartTemperature.Series["Temp"].Points[i].SetValueXY(i+1, temperatureData[i]);
chartHumidity.Series["Humi"].Points[i].SetValueXY(i+1, humidityData[i]);
}
}
...
}
}
```
此代码片段展示了如何初始化串口连接以及持续从指定端口中获取字符串形式的数据,并将其解析成浮点数值后更新至图表中的系列点位置[^4]。
对于 UI 设计方面,则可以在 Visual Studio 的 Designer 视图里轻松完成。只需将 `Chart` 控件拉入窗口内,并配置好样式属性即可满足基本需求[^1]。
阅读全文
相关推荐


















