You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP应用能否用UsbDevice类连接Keil HID例程的STM32开发板?

问题:UWP使用UsbDevice类无法连接STM32 HID设备(HidDevice类可正常连接)

我使用STM32F746G-Discovery开发板搭配Keil USB HID例程,目前UWP应用通过HidDevice类可以正常连接该USB HID设备。但由于需要使用仅UsbDevice类支持的InterruptOut功能,尝试改用UsbDevice类连接开发板却失败了。我采用微软示例代码并替换了正确的VID和PID,想请教这种操作是否不可行,还是连接过程存在问题?我刚接触USB开发,正在学习中。

示例代码如下:

private async void OpenDevice()
{
    UInt32 vid = 0x045E;
    UInt32 pid = 0x0611;

    string aqs = UsbDevice.GetDeviceSelector(vid, pid);

    var myDevices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(aqs);

    try
    {
        usbDevice = await UsbDevice.FromIdAsync(myDevices[0].Id);
    }
    catch (Exception exception)
    {
        ShowStatus(exception.Message.ToString());
    }
    finally
    {
        ShowStatus("Opened device for communication.");
    }

}

核心原因与解决方向

核心问题

HID设备默认被Windows系统的HID专属驱动接管,UsbDevice类对应的是通用USB驱动栈,两者无法同时绑定同一个设备。这就是HidDevice能连接但UsbDevice不行的根本原因。

可行解决方向

  1. 修改STM32固件,改用自定义USB设备类
    这是最直接的解决方案:在Keil的USB配置中,将设备类改为Vendor-specific(类代码0xFF),同时配置Interrupt IN和OUT端点,在固件中实现对应端点的数据处理逻辑。这样系统会为设备加载通用USB驱动,UsbDevice类就能正常识别并连接,同时支持InterruptOut功能。

  2. 排查UWP应用配置与代码问题(辅助步骤)
    如果暂时不想修改固件,先做以下排查确认问题:

    • 检查Package.appxmanifest是否添加了正确的USB设备权限声明,示例如下:
      <DeviceCapability Name="usb">
        <Device Id="vidpid:045E 0611">
          <!-- 自定义类填classId:ff * *;HID类声明无法让UsbDevice连接 -->
          <Function Type="classId:ff * *"/>
        </Device>
      </DeviceCapability>
      
    • 代码中先判断设备枚举结果是否为空,避免索引越界;
    • 捕获更详细的错误信息,比如通过Marshal.GetLastWin32Error()获取Windows错误码(如ERROR_ACCESS_DENIED则明确是驱动占用问题)。

优化后的代码示例

private async void OpenDevice()
{
    UInt32 vid = 0x045E;
    UInt32 pid = 0x0611;

    string aqs = UsbDevice.GetDeviceSelector(vid, pid);
    var myDevices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(aqs);

    if (myDevices.Count == 0)
    {
        ShowStatus("未找到目标USB设备");
        return;
    }

    try
    {
        usbDevice = await UsbDevice.FromIdAsync(myDevices[0].Id);
        if (usbDevice == null)
        {
            int errorCode = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
            ShowStatus($"打开设备失败,错误码:{errorCode}");
        }
        else
        {
            ShowStatus("设备连接成功");
        }
    }
    catch (Exception exception)
    {
        ShowStatus($"异常:{exception.Message}");
    }
}

内容的提问来源于stack exchange,提问作者Tom Van Gaever

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:13:09