C#窗体程序,创建了5个串口,先检查串口的连接状态,指定串口3接收外部十六进制数据“49 28 30 30 2C 30 30 31 2C 31 29”后就触发事件的完整代码
时间: 2024-09-18 10:14:35 浏览: 43
在C#中,要创建一个窗体应用程序并处理串口通信,首先需要安装`System.IO.Ports`命名空间。以下是一个基本的示例,展示了如何检查串口连接状态,以及在接收到特定十六进制数据后触发事件:
```csharp
using System;
using System.IO.Ports;
public partial class MainForm : Form
{
private SerialPort[] serialPorts = new SerialPort[5]; // 创建5个串口实例
public MainForm()
{
InitializeComponent();
// 初始化串口列表,假设COM1到COM5已经存在
for (int i = 0; i < 5; i++)
{
serialPorts[i] = new SerialPort($"COM{i + 1}");
serialPorts[i].DataReceived += OnSerialDataReceived;
serialPorts[i].Open(); // 打开串口
if (!serialPorts[i].IsOpen) // 检查是否成功打开
Console.WriteLine($"Failed to open port {i + 1}");
}
}
private void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string receivedData = sp.ReadExisting(); // 读取接收到的数据
byte[] hexBytes = HexToByteArray(receivedData); // 将十六进制字符串转换为字节数组
if (ArrayEquals(hexBytes, new byte[]{0x49, 0x28, 0x30, 0x30, 0x2C, 0x30, 0x30, 0x31, 0x2C, 0x31})) // 比较接收到的数据与期望值
{
TriggerEvent(receivedData); // 触发事件
}
}
private static bool ArrayEquals(byte[] a, byte[] b)
{
return a.Length == b.Length && System.Array.Equals(a, b);
}
private static byte[] HexToByteArray(string hexString)
{
int len = hexString.Length;
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2)
{
data[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
}
return data;
}
private void TriggerEvent(string data)
{
// 这里你可以自定义触发事件,例如在窗体上显示接收到的数据,或者执行其他业务逻辑
// MessageBox.Show($"Received data: {data}");
// 在实际项目中,可以考虑将这个操作封装成单独的方法或者事件委托
}
// 只有当用户关闭串口连接或者手动停止程序时才关闭所有串口
protected override void OnFormClosing(FormClosingEventArgs e)
{
foreach (SerialPort port in serialPorts)
{
if (port.IsOpen)
port.Close();
}
base.OnFormClosing(e);
}
}
// 在这里添加你需要的事件处理
public delegate void DataReceivedEventHandler(string data);
private event DataReceivedEventHandler DataReceived;
public event DataReceivedEventHandler DataReceived
{
add { DataReceived += value; }
remove { DataReceived -= value; }
}
private void TriggerEvent(string data)
{
DataReceived?.Invoke(data);
}
```
在这个例子中,我们假设`HexToByteArray`函数和`ArrayEquals`函数已实现。请确保已安装`System.IO.Ports`库,并根据实际情况修改串口号和事件处理部分。
阅读全文