搜索
bottom↓
回复: 19

请教个问题,C#能不能获取到电脑上USB口的序号?

[复制链接]

出20入26汤圆

发表于 2023-5-5 16:01:12 | 显示全部楼层 |阅读模式
现在有个需求,需要知道USB设备插在电脑上的哪个USB口。
通过识别USB口,对应插入的设备,或者能否通过插入了USB设备,来知道插进来的是哪个USB口
不是串口,是USB设备

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入984汤圆

发表于 2023-5-5 16:03:54 | 显示全部楼层
WMI就行吧

出0入984汤圆

发表于 2023-5-5 16:07:21 | 显示全部楼层
Himem 发表于 2023-5-5 16:03
WMI就行吧
(引用自2楼)

随手搜到一篇

https://www.cnblogs.com/1175429393wljblog/p/11230449.html

出20入26汤圆

 楼主| 发表于 2023-5-5 16:16:58 | 显示全部楼层
Himem 发表于 2023-5-5 16:07
随手搜到一篇

https://www.cnblogs.com/1175429393wljblog/p/11230449.html
(引用自3楼)

USB哪个信息可以知道插入到电脑哪个USB口

出0入0汤圆

发表于 2023-5-5 16:21:54 | 显示全部楼层
https://www.uwe-sieber.de/usbtreeview_e.html#download

下载这个工具看一下,肯定能获取到是在哪个端口上,但 USB device tree 中的 port 怎么对应到实际的物理端口上,就是另一个问题了

出0入984汤圆

发表于 2023-5-5 16:42:10 | 显示全部楼层
jufr12315 发表于 2023-5-5 16:16
USB哪个信息可以知道插入到电脑哪个USB口
(引用自4楼)


读下他代码 这个是从控制器端口再找插入设备的
自己多打点日志看

出0入4汤圆

发表于 2023-5-5 17:30:02 | 显示全部楼层
  1. 要在C#中找到特定USB设备连接到哪个USB接口,您可以使用 `Win32_USBHub` 类,这样您可以获取与每个USB端口相关的信息。以下是一个示例,展示了如何找到特定设备(通过设备ID)连接到哪个USB接口:

  2. 1. 首先,确保项目中已经引用了 `System.Management` 命名空间,以及添加了以下 `using` 语句:

  3. ```csharp
  4. using System;
  5. using System.Management;
  6. ```

  7. 2. 在 `Main` 方法中,使用以下代码查询特定USB设备连接的USB接口:

  8. ```csharp
  9. static void Main(string[] args)
  10. {
  11.     string targetDeviceId = "YOUR_DEVICE_ID"; // 将此替换为您要查找的USB设备的设备ID

  12.     // 创建一个WMI查询,用于获取USB设备连接的USB接口信息
  13.     string wmiQuery = "SELECT * FROM Win32_USBControllerDevice";
  14.     using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery))
  15.     {
  16.         // 遍历查询结果
  17.         foreach (ManagementObject usbDeviceObject in searcher.Get())
  18.         {
  19.             using (ManagementObject deviceObject = new ManagementObject(usbDeviceObject["Dependent"].ToString()))
  20.             {
  21.                 // 检查设备ID是否与目标设备ID匹配
  22.                 if (deviceObject["DeviceID"].ToString().Contains(targetDeviceId))
  23.                 {
  24.                     // 查询与此设备相关的USB接口
  25.                     string usbControllerQuery = $"ASSOCIATORS OF {{Win32_USBController.DeviceID='{usbDeviceObject["Antecedent"].ToString().Split('=')[1].Trim('"')}}} WHERE AssocClass = Win32_USBControllerDevice";
  26.                     using (ManagementObjectSearcher usbControllerSearcher = new ManagementObjectSearcher(usbControllerQuery))
  27.                     {
  28.                         foreach (ManagementObject usbControllerObject in usbControllerSearcher.Get())
  29.                         {
  30.                             using (ManagementObject usbController = new ManagementObject(usbControllerObject["Dependent"].ToString()))
  31.                             {
  32.                                 if (usbController["PNPDeviceID"].ToString().StartsWith("USB\\ROOT_HUB"))
  33.                                 {
  34.                                     Console.WriteLine($"USB Device '{deviceObject["Name"]}' connected to:");
  35.                                     Console.WriteLine($"  USB Root Hub: {usbController["Name"]}");
  36.                                     Console.WriteLine($"  USB Root Hub DeviceID: {usbController["DeviceID"]}");
  37.                                     Console.WriteLine($"  USB Root Hub PNPDeviceID: {usbController["PNPDeviceID"]}");
  38.                                 }
  39.                             }
  40.                         }
  41.                     }
  42.                 }
  43.             }
  44.         }
  45.     }

  46.     // 暂停控制台以查看输出
  47.     Console.WriteLine("Press any key to exit...");
  48.     Console.ReadKey();
  49. }
  50. ```

  51. 3. 运行程序,并将 `YOUR_DEVICE_ID` 替换为您要查找的USB设备的设备ID。输出将显示设备连接到的USB Root Hub(代表USB接口)。

  52. 请注意,此代码片段可能无法精确显示设备连接到哪个物理USB接口。然而,它可以显示设备连接到的USB Root Hub,这将帮助您找到设备连接到计算机的哪个USB接口。如果您的计算机有多个USB接口,您可以通过比较输出中的USB Root Hub的PNPDeviceID来找到对应的接口
复制代码

出20入26汤圆

 楼主| 发表于 2023-5-6 09:26:52 | 显示全部楼层
wudicgi 发表于 2023-5-5 16:21
https://www.uwe-sieber.de/usbtreeview_e.html#download

下载这个工具看一下,肯定能获取到是在哪个端口 ...
(引用自5楼)

这个软件不错,谢谢

出20入26汤圆

 楼主| 发表于 2023-5-6 09:27:58 | 显示全部楼层

谢谢。我使用这段代码,在33行这句循环进不去

出20入26汤圆

 楼主| 发表于 2023-5-6 15:03:49 | 显示全部楼层
本帖最后由 jufr12315 于 2023-5-6 15:04 编辑

3楼的代码可以用,我截取一部分测试可以获取USB设备的信息,但是不知道如何与电脑USB端口位置对应

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Management;
  4. using System.Text.RegularExpressions;
  5.      /// <summary>
  6.     /// 即插即用设备信息结构
  7.     /// </summary>
  8.     public struct PnPEntityInfo
  9.     {
  10.         public String PNPDeviceID;      // 设备ID
  11.         public String Name;             // 设备名称
  12.         public String Description;      // 设备描述
  13.         public String Service;          // 服务
  14.         public String Status;           // 设备状态
  15.         public UInt16 VendorID;         // 供应商标识
  16.         public UInt16 ProductID;        // 产品编号
  17.         public Guid ClassGuid;          // 设备安装类GUID
  18.     }   

  19.     /// <summary>
  20.     /// 基于WMI获取USB设备信息
  21.     /// </summary>
  22.     public partial class USB
  23.     {      
  24.         #region UsbDevice
  25.         /// <summary>
  26.         /// 获取所有的USB设备实体(过滤没有VID和PID的设备)
  27.         /// </summary>
  28.         public static PnPEntityInfo[] AllUsbDevices
  29.         {
  30.             get
  31.             {
  32.                 return WhoUsbDevice(UInt16.MinValue, UInt16.MinValue, Guid.Empty);
  33.             }
  34.         }

  35.         /// <summary>
  36.         /// 查询USB设备实体(设备要求有VID和PID)
  37.         /// </summary>
  38.         /// <param name="VendorID">供应商标识,MinValue忽视</param>
  39.         /// <param name="ProductID">产品编号,MinValue忽视</param>
  40.         /// <param name="ClassGuid">设备安装类Guid,Empty忽视</param>
  41.         /// <returns>设备列表</returns>
  42.         public static PnPEntityInfo[] WhoUsbDevice(UInt16 VendorID, UInt16 ProductID, Guid ClassGuid)
  43.         {
  44.             List<PnPEntityInfo> UsbDevices = new List<PnPEntityInfo>();

  45.             // 获取USB控制器及其相关联的设备实体
  46.             ManagementObjectCollection USBControllerDeviceCollection = new ManagementObjectSearcher("SELECT * FROM Win32_USBControllerDevice").Get();
  47.             if (USBControllerDeviceCollection != null)
  48.             {
  49.                 foreach (ManagementObject USBControllerDevice in USBControllerDeviceCollection)
  50.                 {   // 获取设备实体的DeviceID
  51.                     String Dependent = (USBControllerDevice["Dependent"] as String).Split(new Char[] { '=' })[1];

  52.                     // 过滤掉没有VID和PID的USB设备
  53.                     Match match = Regex.Match(Dependent, "VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}");
  54.                     if (match.Success)
  55.                     {
  56.                         UInt16 theVendorID = Convert.ToUInt16(match.Value.Substring(4, 4), 16);   // 供应商标识
  57.                         if (VendorID != UInt16.MinValue && VendorID != theVendorID) continue;

  58.                         UInt16 theProductID = Convert.ToUInt16(match.Value.Substring(13, 4), 16); // 产品编号
  59.                         if (ProductID != UInt16.MinValue && ProductID != theProductID) continue;

  60.                         ManagementObjectCollection PnPEntityCollection = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE DeviceID=" + Dependent).Get();
  61.                         if (PnPEntityCollection != null)
  62.                         {
  63.                             foreach (ManagementObject Entity in PnPEntityCollection)
  64.                             {
  65.                                 Guid theClassGuid = new Guid(Entity["ClassGuid"] as String);    // 设备安装类GUID
  66.                                 if (ClassGuid != Guid.Empty && ClassGuid != theClassGuid) continue;

  67.                                 PnPEntityInfo Element;
  68.                                 Element.PNPDeviceID = Entity["PNPDeviceID"] as String;  // 设备ID
  69.                                 Element.Name = Entity["Name"] as String;                // 设备名称
  70.                                 Element.Description = Entity["Description"] as String;  // 设备描述
  71.                                 Element.Service = Entity["Service"] as String;          // 服务
  72.                                 Element.Status = Entity["Status"] as String;            // 设备状态
  73.                                 Element.VendorID = theVendorID;     // 供应商标识
  74.                                 Element.ProductID = theProductID;   // 产品编号
  75.                                 Element.ClassGuid = theClassGuid;   // 设备安装类GUID

  76.                                 UsbDevices.Add(Element);
  77.                             }
  78.                         }
  79.                     }
  80.                 }
  81.             }

  82.             if (UsbDevices.Count == 0) return null; else return UsbDevices.ToArray();
  83.         }
复制代码

出0入4汤圆

发表于 2023-5-6 19:04:12 | 显示全部楼层
jufr12315 发表于 2023-5-6 09:27
谢谢。我使用这段代码,在33行这句循环进不去
(引用自9楼)

试了下确实不行。有个取巧的办法,楼上推荐的usbtreeview软件可以通过命令行后台直接输出报告文件,例如运行“usbtreeview.exe -R:123.txt”,会生成123.txt的文本文档。这样的话可以在C#程序中通过Process去执行运行程序命令,然后去解析生成的txt文件就能找到指定ID对应的端口了。
如果这方法不合适的话,可以用usbtreeview的源码改成一个C++的类库,然后用C#来调用生成的库dll,看了这源码感觉改起来挺麻烦,楼主如果有时间可以试试。

出20入26汤圆

 楼主| 发表于 2023-5-6 20:16:28 | 显示全部楼层
thepresent 发表于 2023-5-6 19:04
试了下确实不行。有个取巧的办法,楼上推荐的usbtreeview软件可以通过命令行后台直接输出报告文件,例如 ...
(引用自11楼)

好的,感谢,现在使用3楼提供的链接里的代码,可以获取USB设备信息,就是不知哪个信息与电脑USB口有关联

出0入4汤圆

发表于 2023-5-7 10:39:27 | 显示全部楼层
jufr12315 发表于 2023-5-6 20:16
好的,感谢,现在使用3楼提供的链接里的代码,可以获取USB设备信息,就是不知哪个信息与电脑USB口有关联 ...
(引用自12楼)

找了一个开源代码,试了可以实现获取usb设备连接的端口。如图中,指定的usb设备连接到根集线器下的第10个hub下面的第一个usb口。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入26汤圆

 楼主| 发表于 2023-5-11 09:57:01 | 显示全部楼层
thepresent 发表于 2023-5-7 10:39
找了一个开源代码,试了可以实现获取usb设备连接的端口。如图中,指定的usb设备连接到根集线器下的第10个 ...
(引用自13楼)


用了这个源码,咋运行不了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入26汤圆

 楼主| 发表于 2023-5-11 10:10:28 | 显示全部楼层
jufr12315 发表于 2023-5-11 09:57
用了这个源码,咋运行不了
(引用自14楼)

通过调试发现 UsbDeviceWinApi.DeviceRegistryPropertyKeys.SPDRP_LOCATION_PATHS 的值是0x23 对应的value是false

出0入0汤圆

发表于 2023-5-11 12:28:30 | 显示全部楼层
以前调试过HID设备,也是用的usb device tree。一个个的遍历

出20入26汤圆

 楼主| 发表于 2023-5-11 14:12:00 | 显示全部楼层
wurst 发表于 2023-5-11 12:28
以前调试过HID设备,也是用的usb device tree。一个个的遍历
(引用自16楼)

请问下,如何获取USB位置路径?可以从以下代码中获取到吗?
  1. ManagementObjectCollection PnPEntityCollection = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE DeviceID=" + Dependent).Get();
  2.                         if (PnPEntityCollection != null)
  3.                         {
  4.                             foreach (ManagementObject Entity in PnPEntityCollection)
  5.                             {
  6.                                 Guid theClassGuid = new Guid(Entity["ClassGuid"] as String);    // 设备安装类GUID
  7.                                 if (ClassGuid != Guid.Empty && ClassGuid != theClassGuid) continue;

  8.                                 PnPEntityInfo Element;
  9.                                 Element.PNPDeviceID = Entity["PNPDeviceID"] as String;  // 设备ID
  10.                                 Element.Name = Entity["Name"] as String;                // 设备名称
  11.                                 Element.Description = Entity["Description"] as String;  // 设备描述
  12.                                 Element.Service = Entity["Service"] as String;          // 服务
  13.                                 Element.Status = Entity["Status"] as String;            // 设备状态
  14.                                 Element.VendorID = theVendorID;     // 供应商标识
  15.                                 Element.ProductID = theProductID;   // 产品编号
  16.                                 Element.ClassGuid = theClassGuid;   // 设备安装类GUID

  17.                                 UsbDevices.Add(Element);

  18.                             }
  19.                         }
复制代码

出0入0汤圆

发表于 2023-5-12 12:33:50 | 显示全部楼层
jufr12315 发表于 2023-5-11 14:12
请问下,如何获取USB位置路径?可以从以下代码中获取到吗?
(引用自17楼)

我不是通过WMI来访问的,直接调用Win32 API。具体可以参考一下电脑圈圈那本书。

出0入4汤圆

发表于 2023-5-13 07:24:08 来自手机 | 显示全部楼层
jufr12315 发表于 2023-5-11 10:10
通过调试发现 UsbDeviceWinApi.DeviceRegistryPropertyKeys.SPDRP_LOCATION_PATHS 的值是0x23 对应的valu ...
(引用自15楼)

你用的什么系统?我在win10和win7上都测试没问题。

出20入26汤圆

 楼主| 发表于 2023-5-14 11:31:33 | 显示全部楼层
thepresent 发表于 2023-5-13 07:24
你用的什么系统?我在win10和win7上都测试没问题。
(引用自19楼)

win10,也可能是我系统的问题。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 17:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表