C#窗体程序,创建2个串口的接收,先检查串口的连接状态,接收到十六进制数据"70 6C 61 79"后触发事件1,接收到十六进制数据"49 28 30 30 2C 30 30 31 2C 31 29"后触发事件2的完整代码
时间: 2024-09-20 17:18:17 浏览: 55
在C#中,创建一个窗体应用程序,并监听两个串口的数据接收,首先需要安装`System.IO.Ports`命名空间来操作串口。以下是代码示例:
```csharp
using System;
using System.IO.Ports;
public partial class MainForm : Form
{
// 定义串口实例
private SerialPort serialPort1 = new SerialPort("COM1"); // 更改为你设备的实际串口号
private SerialPort serialPort2 = new SerialPort("COM2"); // 另一个串口
public MainForm()
{
InitializeComponent();
// 检查串口连接状态
CheckSerialPorts();
// 注册事件处理函数
serialPort1.DataReceived += SerialPortDataReceivedHandler1;
serialPort2.DataReceived += SerialPortDataReceivedHandler2;
}
private void CheckSerialPorts()
{
if (serialPort1.IsOpen)
Console.WriteLine($"{serialPort1.Name} 已经打开");
else
serialPort1.Open();
if (serialPort2.IsOpen)
Console.WriteLine($"{serialPort2.Name} 已经打开");
else
serialPort2.Open();
}
private void SerialPortDataReceivedHandler1(object sender, SerialDataReceivedEventArgs e)
{
string hexData = ((SerialPort)sender).ReadExisting().HexDump();
if (hexData == "70 6C 61 79") // 指定的十六进制数据
OnEventTriggered(1);
}
private void SerialPortDataReceivedHandler2(object sender, SerialDataReceivedEventArgs e)
{
string hexData = ((SerialPort)sender).ReadExisting().HexDump();
if (hexData == "49 28 30 30 2C 30 30 31 2C 31 29") // 指定的十六进制数据
OnEventTriggered(2);
}
// 触发事件的虚方法
protected virtual void OnEventTriggered(int eventNumber)
{
EventHandler handler = EventHandlers[eventNumber];
if (handler != null)
{
handler(this, EventArgs.Empty);
}
else
{
Console.WriteLine($"无对应事件处理器,事件 {eventNumber}");
}
}
// 这里假设你在Form上定义了事件委托列表,例如
public delegate void MyEventHandler(object sender, EventArgs e);
Dictionary<int, MyEventHandler> EventHandlers = new Dictionary<int, MyEventHandler>
{
[1] = YourFirstEventHandlerMethod,
[2] = YourSecondEventHandlerMethod // 替换为实际的方法名
};
// 示例方法,你需在Form中定义它们
private void YourFirstEventHandlerMethod(object sender, EventArgs e) => Console.WriteLine("接收到事件1的数据...");
private void YourSecondEventHandlerMethod(object sender, EventArgs e) => Console.WriteLine("接收到事件2的数据...");
private void buttonOpenPorts_Click(object sender, EventArgs e)
{
CheckSerialPorts();
}
}
```
请注意,此代码只是一个基本框架,你需要在实际项目中将事件处理方法(如`YourFirstEventHandlerMethod` 和 `YourSecondEventHandlerMethod`)替换为你的业务逻辑。同时,确保已经正确配置了串口的波特率、数据位、停止位等属性。
阅读全文