UWP 应用无法 find/connect 到 USB 设备
UWP app cannot find/connect to USB device
我正在尝试制作一个连接到 USB 设备的 UWP 应用程序,然后执行一系列命令,例如从内部传感器(想想加速度计)检索数据。我开始遵循这些准则:
https://msdn.microsoft.com/en-us/library/windows/hardware/dn303343(v=vs.85).aspx
所以,我也尝试制作了一个空白应用程序,并相应地调整了清单:
<Capabilities>
<DeviceCapability Name="usb">
<Device Id="vidpid:1CBE 0003">
<Function Type="classId:ff 00 00" />
</Device>
</DeviceCapability>
</Capabilities>
可以肯定的是,这是设备在设备管理器中标识自己的方式:

然后使用
string aqs = UsbDevice.GetDeviceSelector(vid, pid);
var finder = await DeviceInformation.FindAllAsync(aqs);
然而,没有成功。问题很简单,应用程序找不到任何设备。然后我继续修改这个示例应用程序(它使用 DeviceWatcher 而不是上述查找连接设备 USB 的方法):
https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CustomUsbDeviceAccess
里面也没有找到USB设备。当然,我尝试了另一台 PC,看看它是否与我的配置有关,但如您所料,没有成功。这使我认为它可能与 USB 设备有关,但可能有什么问题?还是我真的在这五行中犯了什么错误?还有其他方法可以尝试连接到 USB 设备吗?任何提示表示赞赏!
相关问题:
UWP/C# - Issue with AQS and USB Devices
看来我找到了解决这个问题的方法,这有点愚蠢,但是嘿,反正谁问我...
我在 Whosebug 上看到了这个:
Cannot create UsbDevice from DeviceInformation.Id
当我使用 .inf 将 winusb 称为驱动程序时,我的问题似乎确实得到了解决。我不知道为什么,所以如果你们有任何解释,请告诉我。
由于上面的回答指的是一个已经存在的博文(我使用了 wayback 机器找到它),我在这里发布了 inf,以防它对任何人有帮助(但它是一个普通的 inf)
;
;
; Installs WinUsb
;
[Version]
Signature = "$Windows NT$"
Class = USBDevice
ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider = %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer=12/12/2016,13.54.20.543
; ========== Manufacturer/Models sections ===========
[Manufacturer]
%ManufacturerName% = Standard,NTamd64
[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_1267&PID_0000
; ========== Class definition ===========
[ClassInstall32]
AddReg = ClassInstall_AddReg
[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2
; =================== Installation ===================
[USB_Install]
Include = winusb.inf
Needs = WINUSB.NT
[USB_Install.Services]
Include =winusb.inf
Needs = WINUSB.NT.Services
[USB_Install.HW]
AddReg=Dev_AddReg
[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{9f543223-cede-4fa3-b376-a25ce9a30e74}"
; [DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
; You must explicitly reference all file-list-section names in this section.
; =================== Strings ===================
[Strings]
ManufacturerName=""
ClassName="Universal Serial Bus devices"
DeviceName="OWI-535 Robotic Arm"
REG_MULTI_SZ = 0x00010000
请注意,我在驱动程序中留下了任意 VID 和 PID,但我仍然必须连接设备告诉我的 VID 和 PID。
这是在 UWP 上连接到 WinUSB 设备的方法。
public async Task<IEnumerable<DeviceDefinition>> GetConnectedDeviceDefinitions(uint? vendorId, uint? productId)
{
var aqsFilter = "System.Devices.InterfaceClassGuid:=\"{DEE824EF-729B-4A0E-9C14-B7117D33A817}\" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True AND " + $" System.DeviceInterface.WinUsb.UsbVendorId:={vendorId.Value} AND System.DeviceInterface.WinUsb.UsbProductId:={productId.Value}";
var deviceInformationCollection = await wde.DeviceInformation.FindAllAsync(aqsFilter).AsTask();
//TODO: return the vid/pid if we can get it from the properties. Also read/write buffer size
var deviceIds = deviceInformationCollection.Select(d => new DeviceDefinition { DeviceId = d.Id, DeviceType = DeviceType.Usb }).ToList();
return deviceIds;
}
这里有一个更完整的答案:
而且,这是来自回购协议的 class:https://github.com/MelbourneDeveloper/Device.Net/blob/master/src/Usb.Net.UWP/UWPUsbDeviceFactory.cs
在我的例子中,设备的 DeviceInterfaceGUID
注册表项丢失了,这似乎是必需的,以便可以找到并实例化 WinUSB 设备。
我添加了带有随机 GUID 的条目 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_16D0&PID_0BD7\None\Device Parameters\DeviceInterfaceGUID
,例如 {86529001-c433-4530-a578-9a67adf1ffa9}
(在我的例子中,16D0
是供应商 ID,0BD7
是产品 ID,None
实例)。这可以从命令行完成,例如,通过调用 reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_16D0&PID_0BD7\None\Device Paramet
ers" /v "DeviceInterfaceGUID" /t REG_SZ /d "{86529001-c433-4530-a578-9a67adf1ffa9}" /f
.
我绝对不是 USB 方面的专家,也不知道为什么需要它或为什么缺少它;但至少就我而言,添加 GUID 对我的 Windows 10 Professional 和 Windows 10 IoT Core (Raspberry PI 3B) 都有帮助。也许查看 https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/usb-device-specific-registry-settings 了解更多详情。
我正在尝试制作一个连接到 USB 设备的 UWP 应用程序,然后执行一系列命令,例如从内部传感器(想想加速度计)检索数据。我开始遵循这些准则:
https://msdn.microsoft.com/en-us/library/windows/hardware/dn303343(v=vs.85).aspx
所以,我也尝试制作了一个空白应用程序,并相应地调整了清单:
<Capabilities>
<DeviceCapability Name="usb">
<Device Id="vidpid:1CBE 0003">
<Function Type="classId:ff 00 00" />
</Device>
</DeviceCapability>
</Capabilities>
可以肯定的是,这是设备在设备管理器中标识自己的方式:
然后使用
string aqs = UsbDevice.GetDeviceSelector(vid, pid);
var finder = await DeviceInformation.FindAllAsync(aqs);
然而,没有成功。问题很简单,应用程序找不到任何设备。然后我继续修改这个示例应用程序(它使用 DeviceWatcher 而不是上述查找连接设备 USB 的方法):
https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CustomUsbDeviceAccess
里面也没有找到USB设备。当然,我尝试了另一台 PC,看看它是否与我的配置有关,但如您所料,没有成功。这使我认为它可能与 USB 设备有关,但可能有什么问题?还是我真的在这五行中犯了什么错误?还有其他方法可以尝试连接到 USB 设备吗?任何提示表示赞赏!
相关问题:
UWP/C# - Issue with AQS and USB Devices
看来我找到了解决这个问题的方法,这有点愚蠢,但是嘿,反正谁问我...
我在 Whosebug 上看到了这个: Cannot create UsbDevice from DeviceInformation.Id
当我使用 .inf 将 winusb 称为驱动程序时,我的问题似乎确实得到了解决。我不知道为什么,所以如果你们有任何解释,请告诉我。
由于上面的回答指的是一个已经存在的博文(我使用了 wayback 机器找到它),我在这里发布了 inf,以防它对任何人有帮助(但它是一个普通的 inf)
;
;
; Installs WinUsb
;
[Version]
Signature = "$Windows NT$"
Class = USBDevice
ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider = %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer=12/12/2016,13.54.20.543
; ========== Manufacturer/Models sections ===========
[Manufacturer]
%ManufacturerName% = Standard,NTamd64
[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_1267&PID_0000
; ========== Class definition ===========
[ClassInstall32]
AddReg = ClassInstall_AddReg
[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2
; =================== Installation ===================
[USB_Install]
Include = winusb.inf
Needs = WINUSB.NT
[USB_Install.Services]
Include =winusb.inf
Needs = WINUSB.NT.Services
[USB_Install.HW]
AddReg=Dev_AddReg
[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{9f543223-cede-4fa3-b376-a25ce9a30e74}"
; [DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
; You must explicitly reference all file-list-section names in this section.
; =================== Strings ===================
[Strings]
ManufacturerName=""
ClassName="Universal Serial Bus devices"
DeviceName="OWI-535 Robotic Arm"
REG_MULTI_SZ = 0x00010000
请注意,我在驱动程序中留下了任意 VID 和 PID,但我仍然必须连接设备告诉我的 VID 和 PID。
这是在 UWP 上连接到 WinUSB 设备的方法。
public async Task<IEnumerable<DeviceDefinition>> GetConnectedDeviceDefinitions(uint? vendorId, uint? productId)
{
var aqsFilter = "System.Devices.InterfaceClassGuid:=\"{DEE824EF-729B-4A0E-9C14-B7117D33A817}\" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True AND " + $" System.DeviceInterface.WinUsb.UsbVendorId:={vendorId.Value} AND System.DeviceInterface.WinUsb.UsbProductId:={productId.Value}";
var deviceInformationCollection = await wde.DeviceInformation.FindAllAsync(aqsFilter).AsTask();
//TODO: return the vid/pid if we can get it from the properties. Also read/write buffer size
var deviceIds = deviceInformationCollection.Select(d => new DeviceDefinition { DeviceId = d.Id, DeviceType = DeviceType.Usb }).ToList();
return deviceIds;
}
这里有一个更完整的答案:
而且,这是来自回购协议的 class:https://github.com/MelbourneDeveloper/Device.Net/blob/master/src/Usb.Net.UWP/UWPUsbDeviceFactory.cs
在我的例子中,设备的 DeviceInterfaceGUID
注册表项丢失了,这似乎是必需的,以便可以找到并实例化 WinUSB 设备。
我添加了带有随机 GUID 的条目 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_16D0&PID_0BD7\None\Device Parameters\DeviceInterfaceGUID
,例如 {86529001-c433-4530-a578-9a67adf1ffa9}
(在我的例子中,16D0
是供应商 ID,0BD7
是产品 ID,None
实例)。这可以从命令行完成,例如,通过调用 reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_16D0&PID_0BD7\None\Device Paramet
ers" /v "DeviceInterfaceGUID" /t REG_SZ /d "{86529001-c433-4530-a578-9a67adf1ffa9}" /f
.
我绝对不是 USB 方面的专家,也不知道为什么需要它或为什么缺少它;但至少就我而言,添加 GUID 对我的 Windows 10 Professional 和 Windows 10 IoT Core (Raspberry PI 3B) 都有帮助。也许查看 https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/usb-device-specific-registry-settings 了解更多详情。