[英]Get COM port (Serial Port) of newly connected USB device in C#
我正在开发 C# 应用程序。 每当新的 USB 驱动器连接到 PC 时,我都必须触发一个事件。 这是我现在的代码:
public class usbState
{
public usbState()
{
}
private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
foreach (var property in instance.Properties)
{
Console.WriteLine(property.Name + " = " + property.Value);
}
}
private void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
foreach (var property in instance.Properties)
{
Console.WriteLine(property.Name + " = " + property.Value);
}
}
public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
insertWatcher.Start();
WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
removeWatcher.Start();
// Do something while waiting for events
System.Threading.Thread.Sleep(20000000);
}
}
class Program
{
static void Main(string[] args)
{
usbState usb = new usbState();
BackgroundWorker bgwDriveDetector = new BackgroundWorker();
bgwDriveDetector.DoWork += usb.backgroundWorker1_DoWork;
bgwDriveDetector.RunWorkerAsync();
bgwDriveDetector.WorkerReportsProgress = true;
bgwDriveDetector.WorkerSupportsCancellation = true;
// System.Threading.Thread.Sleep(100000);
Console.ReadKey();
}
}
此代码工作正常,并给出了附加的 USB 的属性,但问题是它没有给出连接 USB 的端口。 我怎样才能获得我们附加了 USB 的端口号。
我使用此方法返回端口的确切名称(COM1、COM2...),您应该提供设备的预期名称,例如(arduino、Camra...)和以毫秒为单位的搜索超时:
private string GetCOMName(string sExpectedPortName, int iTimeOut)
{
Stopwatch sp = new Stopwatch(); sp.Start();
string sPortName = "Unknown";
bool isPortFound = false;
while (sp.ElapsedMilliseconds < iTimeOut)
{
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%(COM%'"))
{
var portnames = SerialPort.GetPortNames();
var ports = searcher.Get().Cast<ManagementBaseObject>().ToList().Select(p => p["Caption"].ToString());
var portList = portnames.Select(n => n + " - " + ports.FirstOrDefault(s => s.Contains(n))).ToList();
foreach (var port in portList)
{
// Pass here the expected name of your port , for example (Arduino or Camera...)
if (port.Contains(sExpectedPortName))
{
var start = port.IndexOf("(") + 1;//add one to not include quote
var end = port.LastIndexOf(")") - start;
sPortName = port.Substring(start, end);
isPortFound = true;
break;
}
}
Thread.Sleep(1000);
}
// if the port is found then we go out from the whileloop
if (true == isPortFound)
break;
}
// return the result
return sPortName;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.