WPF moudle类串口通信
时间: 2024-12-26 22:16:58 浏览: 16
### 实现 WPF 应用程序中的串口通信
为了在 Windows Presentation Foundation (WPF) 应用程序中实现串口通信,可以创建一个模块类来处理所有的串口操作。这不仅有助于保持代码整洁,还使得维护更加容易。
#### 创建 SerialPortHelper 类
定义 `SerialPortHelper` 类用于封装 .NET Framework 提供的 `System.IO.Ports.SerialPort` 功能:
```csharp
using System;
using System.IO.Ports;
public class SerialPortHelper : IDisposable {
private readonly SerialPort _serialPort;
public event EventHandler<DataReceivedEventArgs> DataReceived;
public string PortName { get; set; }
public int BaudRate { get; set; }
public SerialPortHelper(string portName, int baudRate) {
PortName = portName;
BaudRate = baudRate;
_serialPort = new SerialPort(PortName, BaudRate);
_serialPort.DataReceived += OnDataReceived;
}
protected virtual void OnDataReceived(object sender, SerialDataReceivedEventArgs e) {
var data = _serialPort.ReadExisting();
DataReceived?.Invoke(this, new DataReceivedEventArgs(data));
}
public void Open() {
if (!_serialPort.IsOpen)
_serialPort.Open();
}
public void Close() {
if (_serialPort.IsOpen)
_serialPort.Close();
}
public void Write(string message) {
if (_serialPort.IsOpen)
_serialPort.WriteLine(message);
}
public void Dispose() {
_serialPort.Dispose();
}
}
// 自定义事件参数类
public class DataReceivedEventArgs : EventArgs {
public string ReceivedData { get; }
public DataReceivedEventArgs(string receivedData) => ReceivedData = receivedData;
}
```
此代码片段展示了如何构建一个简单的辅助器模式类[^1]。
#### 将其集成到 WPF 中
通过 MVVM 或者 Code-Behind 方法可以在 XAML 文件背后使用上述 C# 逻辑连接实际硬件设备并读取数据。对于更复杂的项目推荐采用 MVVM 架构以便更好地分离关注点。
当利用这个帮助器时,在视图模型(ViewModel)里实例化它,并订阅它的 `DataReceived` 事件以响应接收到的数据变化:
```csharp
private readonly SerialPortHelper _serialPortHelper;
public MainWindowViewModel() {
_serialPortHelper = new SerialPortHelper("COM3", 9600); // 假设 COM3 是目标端口
_serialPortHelper.DataReceived += HandleNewDataFromDevice;
try {
_serialPortHelper.Open();
} catch (UnauthorizedAccessException ex) {
Console.WriteLine($"无法打开指定的串行端口: {ex.Message}");
}
}
private void HandleNewDataFromDevice(object sender, DataReceivedEventArgs args) {
Debug.WriteLine(args.ReceivedData);
}
```
这段示例说明了怎样初始化和配置串口对象以及监听传入的信息流[^2]。
阅读全文