如何让我的 UWP 应用区分两个相同的 USB 设备?

How can I get my UWP app to differentiate between two identical USB devices?

我正在编写一个与两个微控制器(Teensy 3.2 和 3.6)接口的 UWP 应用程序,每个微控制器都被编程为做不同的事情。当编程为串行设备时,uC 的 VID 和 PID 总是分别为 0x16C0 和 0x0483。

从 IDE,我可以将它们的类型更改为以下任何一种:

当它们都被编程为串行设备时,它们会像这样显示在 UWP 串行示例应用中:

您可能认为这将使我能够根据 PID 之后的所有内容来区分两者,但是,它们似乎每隔一段时间就会在我启动应用程序时切换位置。真令人沮丧。此外,当我连接到它们中的任何一个时,大括号中的部分总是相同的:

我已经尝试将类型更改为各种不同的东西,而且我基本上能够与这两种设备通信,但它们在设备管理器中显示为我制作的任何东西,我担心这可能会导致冲突与我的系统的其余部分。例如,将其设置为 "All of the Above" 设备可让我的计算机将其视为音频,这会导致 Hulu 在尝试将数字音频发送到微控制器时崩溃。如果可能的话,我想让它们都作为串行设备吗?

是否有任何其他识别 属性 我可以用来对我的应用程序进行硬编码以识别我的设备?我会运行这个应用程序在专用电脑上。

PID后面的部分是设备的序列号。因为你有一个没有内置序列号的自制板 Windows 无法区分两个设备并分配一个自动生成的序列号。

序列号存储在结构体usb_string_serial_number中,该结构体定义为weak,可以被用户代码覆盖。因此,您可以通过将以下代码添加到您的草图或单独的 *.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 报告以下 deviceId:

请注意: 引导加载程序仍然报告 "old" 序列号,这让一些上传者(例如 tyTools)感到困惑。股票 Teensy 上传器 (Teensy.exe) 可以毫无问题地处理这个问题。