在我的项目(C#,WPF应用程序(中,我的设备显示为VCP。我需要连接到它。我正在使用WMI检测串行端口,并通过VID和PID进行过滤。它使工作在 90% 内完成。设备制造商对所有设备使用相同的 VID/PID 对。准确的模型在 USB 描述符中(设备处理器部分,属性 iProduct(。我在探索 WMI 的任何地方都找不到这个。
如何使用 .NET 访问 USB 描述器?在 C# 中,阅读 USB 描述符答案建议使用 WMI。在 WMI 设备描述中不是 USB 描述符。我不需要列出连接的 USB 设备,而是从 USB 设备描述符中读取特定数据。
非常有用的文章 https://lihashgnis.blogspot.com/2018/07/getting-descriptors-from-usb-device.html 我刚刚添加了一些代码来获取字符串描述符:
USB_STRING_DESCRIPTOR* stringDescriptor = nullptr;
int sBufferSize = sizeof(USB_DESCRIPTOR_REQUEST) + MAXIMUM_USB_STRING_LENGTH;
BYTE *sBuffer = new BYTE[sBufferSize];
memset(sBuffer, 0, sBufferSize);
requestPacket = (USB_DESCRIPTOR_REQUEST*)sBuffer;
stringDescriptor = (USB_STRING_DESCRIPTOR*)((BYTE*)sBuffer + sizeof(USB_DESCRIPTOR_REQUEST));
requestPacket->SetupPacket.bmRequest = 0x80;
requestPacket->SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR;
requestPacket->ConnectionIndex = usbPortNumber;
requestPacket->SetupPacket.wValue = (USB_STRING_DESCRIPTOR_TYPE << 8); // String Descriptior 0
requestPacket->SetupPacket.wLength = MAXIMUM_USB_STRING_LENGTH;
err = DeviceIoControl(hUsbHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, sBuffer, sBufferSize, sBuffer, sBufferSize, &bytesReturned, nullptr);
// Now get iProduct string in language at zero index
requestPacket->SetupPacket.wValue = (USB_STRING_DESCRIPTOR_TYPE << 8) | deviceDescriptor->iProduct;
requestPacket->SetupPacket.wIndex = (USHORT)stringDescriptor->bString[0];
err = DeviceIoControl(hUsbHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, sBuffer, sBufferSize, sBuffer, sBufferSize, &bytesReturned, nullptr);
std::wcout << stringDescriptor->bString