Как получить дескрипторы строк USB с устройства CDC в UWPC#

Место общения программистов C#
Anonymous
Как получить дескрипторы строк USB с устройства CDC в UWP

Сообщение Anonymous »

Это другой взгляд на тот же вопрос, поставленный здесь. Я пытался объединить советы отсюда и здесь, а также из других мест, ссылки на которые мне не под рукой.
У меня есть встроенное устройство с 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 для создания селектора устройств, а затем для создания экземпляра SerialDevice с его FromIdAsync.< /p>

Код: Выделить всё

SerialDevice
не предоставляет необходимые дескрипторы USB. Я нашел следующий фрагмент (сейчас не могу найти ссылку на источник) для чтения произвольных дескрипторов в платформе UWP (слегка измененный, чтобы предположить, что все является строкой):

Код: Выделить всё

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.FromIdAsync(dev.Id) вызывает исключение ArgumentException с сообщением «Значение не попадает в ожидаемый диапазон».
Если я сделаю резервную копию и попытаюсь использовать методы UsbDevice для создания строки AQS (например, UsbDevice.GetDeviceSelector(0x0483, 0xA4DA);), DeviceInformation.FindAllAsync дает пустой список.
Поскольку я контролирую код на обоих концах, я мог бы просто получить этот серийный номер посредством связи с устройством, но это кажется излишним, поскольку он является частью дескрипторов USB .
Что мне здесь не хватает? Это просто невозможно? Также обратите внимание, что iSerialNumber не отображается в свойствах устройства, перечисленных в диспетчере устройств; Я читал в одном месте, что драйвер должен отображать эти свойства в стеке.

Подробнее здесь: https://stackoverflow.com/questions/787 ... ice-in-uwp

Вернуться в «C#»