C#窗体程序,创建串口的接收,先检查串口的连接状态,使用异步接收的方式,接收到数据"play"后触发事件1,接收到数据"pause "后触发事件2的完整代码
时间: 2024-09-19 16:03:49 浏览: 35
在C#中,创建一个Windows Forms应用程序并处理串口通信,你可以使用System.IO.Ports命名空间下的SerialPort类。首先,你需要初始化串口并检查连接状态,然后使用异步方法接收数据并触发相应的事件。以下是一个简化的示例代码:
```csharp
using System;
using System.IO.Ports;
using System.Threading;
public partial class MainForm : Form
{
private SerialPort serialPort;
public event EventHandler PlayEvent;
public event EventHandler PauseEvent;
public MainForm()
{
InitializeComponent();
serialPort = new SerialPort("COM1", 9600); // 修改为你实际的串口号和波特率
serialPort.DataReceived += SerialPort_DataReceived;
}
private void MainForm_Load(object sender, EventArgs e)
{
CheckConnection();
}
private void CheckConnection()
{
if (!serialPort.IsOpen)
{
try
{
serialPort.Open();
Console.WriteLine("串口已打开");
}
catch (Exception ex)
{
MessageBox.Show($"无法打开串口: {ex.Message}");
}
}
else
{
Console.WriteLine("串口已经打开");
}
}
private async void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPort.ReadExisting(); // 异步读取数据
switch (data)
{
case "play":
if (PlayEvent != null)
await Task.Run(() => PlayEvent(this, EventArgs.Empty)); // 在新线程上触发事件,避免阻塞UI
break;
case "pause":
if (PauseEvent != null)
await Task.Run(() => PauseEvent(this, EventArgs.Empty));
break;
// 添加其他需要处理的数据情况...
}
}
protected override async void OnClosing(CancelEventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close();
}
base.OnClosing(e);
}
}
// 使用示例:
MainForm mainForm = new MainForm();
mainForm.PlayEvent += MainForm_PlayEvent; // 注册事件处理
mainForm.ShowDialog();
private static void MainForm_PlayEvent(object sender, EventArgs e) => Console.WriteLine("Play Event Triggered"); // 你的事件处理逻辑
private static void MainForm_PauseEvent(object sender, EventArgs e) => Console.WriteLine("Pause Event Triggered"); // 你的事件处理逻辑
```
在这个示例中,我们创建了一个`SerialPort_DataReceived`方法用于监听串口数据。当接收到“play”或“pause”时,会分别触发`PlayEvent`和`PauseEvent`事件。注意,为了保持UI响应,我们在异步任务中引发事件。
阅读全文