Как я могу заставить свое приложение UWP различать два одинаковых USB-устройства? - PullRequest
0 голосов
/ 05 апреля 2020

Я пишу приложение UWP, которое взаимодействует с двумя микроконтроллерами (Teensy 3.2 и 3.6), каждый из которых запрограммирован на выполнение разных задач. При программировании в качестве последовательных устройств VID и PID u C всегда равны 0x16C0 и 0x0483 соответственно.

Из IDE я могу изменить их тип на любой из следующих:

available USB types

Когда они оба запрограммированы как последовательные устройства, они отображаются в приложении последовательного образца UWP следующим образом:

USB devices

Вы могли бы подумать, что это позволило бы мне различать эти два на основе всего после PID, однако, они, кажется, меняются местами каждый раз, когда я запускаю приложение. Это расстраивает. Кроме того, когда я подключаюсь к любому из них, часть в фигурных скобках всегда одинакова:

enter image description here

Я пытался изменить тип на различные вещи и я в основном могу общаться с обоими устройствами, но они отображаются в диспетчере устройств как все, что я их делаю, и я обеспокоен тем, что это может вызвать конфликты с остальной частью моей системы. Например, установка его как устройства «Все из вышеперечисленного» позволяет моему компьютеру видеть его как аудио, что заставило Hulu создать sh, когда он попытался отправить цифровое аудио на микроконтроллер. Я хотел бы, чтобы они оба были последовательными устройствами, если это возможно?

Есть ли какое-либо другое идентифицирующее свойство, которое я могу использовать, чтобы жестко кодировать мое приложение для распознавания моих устройств? Я буду запускать это приложение на выделенном компьютере.

1 Ответ

1 голос
/ 25 апреля 2020

Часть после PID - это серийный номер устройства. Поскольку у вас есть доморощенная доска без встроенного серийного номера Windows, вы не можете различить guish двух устройств и присваивает автоматически сгенерированный серийный номер.

Серийный номер хранится в структуре usb_string_serial_number, которая определена как слабая и может быть переопределена кодом пользователя. Таким образом, вы можете легко указать собственный серийный номер, добавив следующий код в эскиз или в отдельный файл *. cpp.

extern "C"
{
    struct usb_string_descriptor_struct
    {
        uint8_t bLength;
        uint8_t bDescriptorType;
        uint16_t wString[10];
    };

    usb_string_descriptor_struct usb_string_serial_number =
        {
            22,
            3,
            {'M','Y', 'S','N', '0', '0', '0','0', '1', 0},
    };
}


void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  digitalWriteFast(LED_BUILTIN, !digitalReadFast(LED_BUILTIN));
  delay(200);
}

После загрузки Windows сообщает следующий идентификатор устройства:

enter image description here

Обратите внимание: bootloader по-прежнему сообщает «старый» серийный номер, который сбивает с толку некоторые загрузчики (например, tyTools). Стандартный загрузчик Teensy (Teensy.exe) справляется с этим без проблем.

...