windows11 csharp实现串口热插拔监听并通过Win32_SerialPort获取串口名称
时间: 2023-09-23 16:06:46 浏览: 341
### 回答1:
您好!关于您的问题,我可以给出以下参考答案:
CSharp中可以使用SerialPort类实现串口的热插拔监听,当串口插拔事件触发时,就可以通过Win32_SerialPort获取串口名称。
具体的实现代码可以参考以下示例:
```CSharp
using System;
using System.IO.Ports;
using System.Management;
public class SerialPortMonitor
{
private ManagementEventWatcher portInsertWatcher;
private ManagementEventWatcher portRemoveWatcher;
public event EventHandler<string> PortInsertEvent;
public event EventHandler<string> PortRemoveEvent;
public void Start()
{
// 设置监听范围为Win32_SerialPort类
var query = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_SerialPort'");
portInsertWatcher = new ManagementEventWatcher(query);
portInsertWatcher.EventArrived += PortInsertEventHandler;
portInsertWatcher.Start();
query = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_SerialPort'");
portRemoveWatcher = new ManagementEventWatcher(query);
portRemoveWatcher.EventArrived += PortRemoveEventHandler;
portRemoveWatcher.Start();
}
public void Stop()
{
if (portInsertWatcher != null)
{
portInsertWatcher.Stop();
portInsertWatcher = null;
}
if (portRemoveWatcher != null)
{
portRemoveWatcher.Stop();
portRemoveWatcher = null;
}
}
private void PortInsertEventHandler(object sender, EventArrivedEventArgs e)
{
var port = (string)e.NewEvent["TargetInstance"]["DeviceID"];
PortInsertEvent?.Invoke(this, port);
}
private void PortRemoveEventHandler(object sender, EventArrivedEventArgs e)
{
var port = (string)e.NewEvent["TargetInstance"]["DeviceID"];
PortRemoveEvent?.Invoke(this, port);
}
}
```
以上是参考答案,希望能对您有所帮助。如果您有其他问题,可以继续向我提问。
### 回答2:
在Windows 11系统中,可以使用C#编程语言实现串口的热插拔监听,并通过调用Win32_SerialPort类获取串口的名称。
首先,我们需要添加对System.Management命名空间的引用,该命名空间包含了用于管理Windows管理对象的类和接口。
接下来,在C#代码中,我们可以使用ManagementEventWatcher类来监听串口的插拔事件。创建ManagementEventWatcher对象时,我们需要指定一个查询语句,该查询语句用于过滤我们所关注的事件类型。
下面是一个示例代码,实现了串口的热插拔监听,并通过Win32_SerialPort类获取串口名称:
```csharp
using System;
using System.Management;
public class SerialPortListener
{
public static void Main()
{
// 创建查询语句,过滤串口插拔事件
string query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2";
// 创建ManagementEventWatcher对象,并指定查询语句
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
// 注册事件处理程序
watcher.EventArrived += new EventArrivedEventHandler(SerialPortEventArrived);
// 开始监听事件
watcher.Start();
// 阻塞,防止程序退出
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
// 停止监听
watcher.Stop();
}
private static void SerialPortEventArrived(object sender, EventArrivedEventArgs e)
{
// 获取Win32_DeviceChangeEvent事件的TargetInstance对象
ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
// 判断TargetInstance对象的类名是否为Win32_PnPEntity
if (targetInstance != null && targetInstance.ClassPath.ClassName == "Win32_PnPEntity")
{
// 获取设备的名称
string name = (string)targetInstance["Name"];
// 判断设备名称是否包含"COM",用于过滤串口设备
if (name.Contains("COM"))
{
// 获取串口名称
int startIndex = name.IndexOf("(COM") + 1;
int endIndex = name.IndexOf(")", startIndex);
string serialPortName = name.Substring(startIndex, endIndex - startIndex);
Console.WriteLine("Serial port {0} {1}.", serialPortName, e.NewEvent.ClassPath.ClassName);
}
}
}
}
```
以上代码创建了一个SerialPortListener类,其中Main方法负责创建和启动ManagementEventWatcher对象,并注册了SerialPortEventArrived方法作为事件处理程序。
SerialPortEventArrived方法会在串口热插拔事件发生时被调用,根据事件对象获取串口设备的名称,并输出到控制台。
注意,该示例代码中的过滤条件是根据Win32_DeviceChangeEvent事件的EventType属性进行筛选,EventType等于2表示设备插入事件,等于3表示设备移除事件。如果你只关注特定的串口设备,可以进一步调整过滤条件。
希望以上回答对你有所帮助!
### 回答3:
在 Windows 11 中通过 C# 实现串口热插拔监听可以通过使用 ManagementEventWatcher 来监视系统对串口的操作。同时,可以通过调用 WMI (Windows Management Instrumentation) 来获取串口名称。
首先,我们需要引入 System.Management 命名空间,使用 ManagementEventWatcher 和 WMI 进行操作。在代码中,我们创建一个 ManagementEventWatcher 对象,并使用 WQL (Windows Management Instrumentation Query Language) 查询串口相关的 WMI 事件。
```csharp
using System;
using System.Management;
class Program
{
static void Main()
{
// 设置查询条件,筛选出串口变化和状态变化的事件
string query = @"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PnPEntity' AND TargetInstance.Description LIKE 'Communications Port%'";
// 创建 ManagementEventWatcher 对象
ManagementEventWatcher watcher = new ManagementEventWatcher(new WqlEventQuery(query));
// 注册事件处理程序
watcher.EventArrived += new EventArrivedEventHandler(SerialPortChanged);
// 启动监视
watcher.Start();
// 等待退出信号
Console.WriteLine("按任意键退出...");
Console.ReadKey();
// 停止监视
watcher.Stop();
}
// 事件处理程序
static void SerialPortChanged(object sender, EventArrivedEventArgs e)
{
// 从事件参数中获取 TargetInstance 对象
ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
// 获取串口名称
string portName = (string)targetInstance["Caption"];
Console.WriteLine("串口变化:{0}", portName);
}
}
```
上述代码中,我们使用 WMI 查询串口设备的变动,包括插入、拔出和状态变化。如果在监视状态下插入或拔出串口设备,事件处理程序 SerialPortChanged 将捕获到对应的事件,并获取串口的名称。你可以根据具体的需求对事件处理程序进行扩展,例如增加通知、记录日志等操作。
阅读全文