【问题标题】:Cannot create UsbDevice from DeviceInformation.Id无法从 DeviceInformation.Id 创建 UsbDevice
【发布时间】:2016-05-11 12:34:16
【问题描述】:

我正在尝试使用仅适用于 PC 的通用 Windows 应用(无手机)(WinRT),通过 Windows.Devices.Usb API 连接到设备 (SecuGen Hamster Pro 20)。

该设备是指纹扫描仪。

我已经完成了网上找到的所有步骤:

我查找了所有使用以下设备的设备:

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

这将返回大约 1400 个设备。经过一些过滤使用:

 var resultList = myDevices.Where(s => s.Name.ToLower().Contains("secu")).ToList<DeviceInformation>();

resultList 在我的机器中包含 3 个设备(我在其他机器上尝试过,在某些机器上发现了 10 个结果)。

我没有使用重载来查找设备 DeviceInformation.FindAllAsync(String aqsFilter),因为它返回 0 个结果,尽管我确信我做对了(使用了正确的 VID 和 PID)

这里的问题是当我尝试使用以下 3 个结果中的任何一个创建 UsbDevice 对象时:

UsbDevice device = await UsbDevice.FromIdAsync(resultList[0].Id);

返回值为null,我都试过了(resultList[0]resultList[1]resultList[2])都没有运气。

我使用以下方法配置了功能:

 <DeviceCapability Name="usb">
      <Device Id="vidpid:1162 2200">
        <Function Type="name:vendorSpecific"/>
      </Device>
    </DeviceCapability> 

我还尝试从DeviceInformation.FindAllAsync() 返回的 1400 个设备中的任何一个创建一个 UsbDevice 对象,但所有设备都返回 null,甚至有些抛出异常,显示为 the system cannot find the file specified 0x80070002

我尝试读取 DeviceAccessInformation 以获取它返回的设备 DeviceAccessStatus.Unspecified

任何人都可以引导我了解我在这里缺少什么?

【问题讨论】:

    标签: c# windows-runtime usb win-universal-app hardware


    【解决方案1】:

    您必须使用 UsbDevice.GetDeviceSelector 然后在搜索设备时使用选择器。如果没有返回任何内容,则设备未正确“配置”为使用 WinUSB.sys 驱动程序。 (据我了解,它必须使用该驱动程序才能与 usbdevice 类一起使用)。

    如果您在设备管理器中手动告诉它使用该驱动程序,那么理论上,您仍然需要使用 regedit 更改密钥才能正常工作(注意:我这样做了,但仍然无法正常工作)。我在这里找到了一个解决方案: http://www.lewisbenge.net/2013/09/20/integrating-windows-8-1-with-owi-535-robotic-arm/ 基本上,您必须使用 inf 文件安装驱动程序。使用该站点上链接的那个,并根据目标平台将 NTamd64 替换为 NTarm

    【讨论】:

      【解决方案2】:

      首先,尝试按供应商和产品 ID 缩小搜索范围

      此方法将帮助您做到这一点:

      public static async Task<List<wde.DeviceInformation>> GetDevicesByProductAndVendorAsync(int vendorId, int productId)
      {
          return ((IEnumerable<wde.DeviceInformation>)await wde.DeviceInformation.FindAllAsync($"System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True AND System.DeviceInterface.Hid.VendorId:={vendorId} AND System.DeviceInterface.Hid.ProductId:={productId} ").AsTask()).ToList();
      }
      

      https://github.com/MelbourneDeveloper/Hid.Net/blob/c69e3368343e59e51e8818c87dbea00e6ccfecae/Hid.Net.UWP/UWPHelpers.cs#L11

      您将能够从中获取已连接设备的列表。然后,您应该能够与 FromIdAsync 连接。

      【讨论】:

        猜你喜欢
        • 2013-07-23
        • 2022-01-20
        • 2018-10-29
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多