C#窗体程序,创建了3个串口,先检查串口的连接状态,指定COM3收到十六进制多字节数据后,解析数据触发事件1的完整代码
时间: 2024-09-18 19:06:41 浏览: 36
在C#中,创建窗体应用程序并处理串口通信,包括检查连接状态、接收十六进制数据和触发事件的过程可以分为以下几个步骤。首先确保已添加`System.IO.Ports`命名空间,用于操作串口。
```csharp
using System;
using System.IO.Ports;
public partial class MainForm : Form
{
private SerialPort serialPort1, serialPort2, serialPort3; // 创建串口实例
public MainForm()
{
InitializeComponent();
// 初始化串口对象
serialPort1 = new SerialPort("COM3"); // 示例中假设 COM3
serialPort2 = new SerialPort("COM4");
serialPort3 = new SerialPort("COM5");
// 设置事件处理器
serialPort1.DataReceived += SerialPort_DataReceived;
serialPort2.DataReceived += SerialPort_DataReceived;
serialPort3.DataReceived += SerialPort_DataReceived;
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (sender is SerialPort sp)
{
string hexData = sp.ReadExisting(); // 接收十六进制数据
int bytesLength = hexData.Length / 2; // 十六进制每两个字符对应一个字节
byte[]解码数据 = HexStringToByteArray(hexData); // 解析十六进制字符串为字节数组
// 检查数据是否解析成功,然后触发事件1
if (decodeData != null && decodeData.Length == bytesLength)
{
OnEvent1(decodeData);
}
else
{
Console.WriteLine($"无法解析数据: {hexData}");
}
}
}
private static byte[] HexStringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
// 触发事件1的委托声明
public delegate void Event1Handler(byte[] data);
public event Event1Handler Event1;
private void OnEvent1(byte[] data)
{
if (Event1 != null)
{
Event1(data);
}
}
// 省略其他窗体相关的事件和生命周期方法...
// 串口打开和关闭的示例,需要根据实际需求调整
private void btnConnect_Click(object sender, EventArgs e)
{
serialPort1.Open();
serialPort2.Open();
serialPort3.Open();
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
serialPort1.Close();
serialPort2.Close();
serialPort3.Close();
}
//
阅读全文