简体   繁体   English

从 USB 设备描述符获取数据

[英]Get data from USB device descriptor

In my project (C#, WPF application) I have device that appears as VCP.在我的项目(C#、WPF 应用程序)中,我有一个显示为 VCP 的设备。 I need connect to it.我需要连接到它。 I am detecting serial port using WMI and filter by VID and PID.我正在使用 WMI 检测串口并通过 VID 和 PID 过滤。 It makes job done in 90%.它使工作完成 90%。 Device manufacturer uses same VID/PID pair for all devices.设备制造商对所有设备使用相同的 VID/PID 对。 Accurate model is in USB descriptor (Device Decsriptor part, property iProduct).准确的模型在 USB 描述符中(设备描述符部分,属性 iProduct)。 I can't find this anywhere exploring WMI.我在探索 WMI 的任何地方都找不到这个。

How can I get to USB decriptor with .NET?如何使用 .NET 访问 USB 解码器? In C# read USB Descriptor answers suggest to use WMI.C# 中阅读 USB Descriptor答案建议使用 WMI。 In WMI device description is not USB descriptor.在 WMI 中,设备描述不是 USB 描述符。 I don't need to list connected USB devices but to read specific data from USB device descriptor.我不需要列出连接的 USB 设备,而是从 USB 设备描述符中读取特定数据。

Very helpful article https://lihashgnis.blogspot.com/2018/07/getting-descriptors-from-usb-device.html I have just added some code to get String Descriptor:非常有用的文章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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM