У меня есть встроенное устройство с USB-портом, код которого полностью под моим контролем. В настоящее время он устанавливает строковый дескриптор в дескрипторе устройства USB с индексом 3 для представления серийного номера устройства (иногда называемого iSerialNumber). Устройство реализует USB CDC и отображается как последовательный порт в диспетчере устройств.
Я могу успешно обнаружить это устройство через VID и PID с помощью следующего кода:
Код: Выделить всё
selector = SerialDevice.GetDeviceSelectorFromUsbVidPid(0x0483, 0xA4DA);
var devs = await DeviceInformation.FindAllAsync(selector);
foreach(var dev in devs) {
var device = await SerialDevice.FromIdAsync(dev.Id)
// take note of that device we found...
}
Код: Выделить всё
SerialDeviceКод: Выделить всё
UsbDevice usbdev = await UsbDevice.FromIdAsync(dev.Id);
var config = usbdev.Configuration;
foreach(UsbDescriptor desc in config.Descriptors) {
var descriptorBuffer = new Windows.Storage.Streams.Buffer(desc.Length);
desc.ReadDescriptorBuffer(descriptorBuffer);
DataReader reader = DataReader.FromBuffer(descriptorBuffer);
reader.ByteOrder = ByteOrder.LittleEndian;
var length = reader.ReadByte();
String str = reader.ReadString(length);
if(str != null) {
Debug.WriteLine("{0}: {1}", desc.DescriptorType, str);
}
}
Если я сделаю резервную копию и попытаюсь использовать методы UsbDevice для создания строки AQS (например, UsbDevice.GetDeviceSelector(0x0483, 0xA4DA);), DeviceInformation.FindAllAsync дает пустой список.
Поскольку я контролирую код на обоих концах, я мог бы просто получить этот серийный номер посредством связи с устройством, но это кажется излишним, поскольку он является частью дескрипторов USB .
Что мне здесь не хватает? Это просто невозможно? Также обратите внимание, что iSerialNumber не отображается в свойствах устройства, перечисленных в диспетчере устройств; Я читал в одном месте, что драйвер должен отображать эти свойства в стеке.
Подробнее здесь: https://stackoverflow.com/questions/787 ... ice-in-uwp