LibUsbDotNet открыть устройство -> устройство не найдено
У меня есть usbasp программатор для микроконтроллеров AVR. Этот программист использует библиотеку libusb. Мне удалось подключить его к компьютеру, система обнаружила новое устройство, и мне удалось установить драйвер для этого устройства. Это работает хорошо, так как я могу программировать чипы AVR с ним. Так что с аппаратной частью все в порядке.
Теперь программная часть: используя простую итерацию по моим устройствам libusb-win32 с использованием LibUsbDotNet, я нахожу 2 устройства. Оба они названы одинаково (и имеют одинаковые VID и PID), поэтому я думаю, что это составное устройство. Второй имеет некоторые данные в нем. Это хорошо показано на скриншотах ниже.
И код (это просто копия, вставленная из примеров)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LibUsbDotNet;
using LibUsbDotNet.Info;
using LibUsbDotNet.Main;
namespace USB_Test_CLI_CS {
class Program {
public static readonly int VendorID = 0x16C0;
public static readonly int ProductID = 0x05DC;
public static void Main(string[] args) {
UsbDevice usbDevice = null;
UsbRegDeviceList allDevices = UsbDevice.AllDevices;
Console.WriteLine("Found {0} devices", allDevices.Count);
foreach (UsbRegistry usbRegistry in allDevices) {
Console.WriteLine("Got device: {0}\r\n", usbRegistry.FullName);
if (usbRegistry.Open(out usbDevice)) {
Console.WriteLine("Device Information\r\n------------------");
Console.WriteLine("{0}", usbDevice.Info.ToString());
Console.WriteLine("VID & PID: {0} {1}", usbDevice.Info.Descriptor.VendorID, usbDevice.Info.Descriptor.ProductID);
Console.WriteLine("\r\nDevice configuration\r\n--------------------");
foreach (UsbConfigInfo usbConfigInfo in usbDevice.Configs) {
Console.WriteLine("{0}", usbConfigInfo.ToString());
Console.WriteLine("\r\nDevice interface list\r\n---------------------");
IReadOnlyCollection<UsbInterfaceInfo> interfaceList = usbConfigInfo.InterfaceInfoList;
foreach (UsbInterfaceInfo usbInterfaceInfo in interfaceList) {
Console.WriteLine("{0}", usbInterfaceInfo.ToString());
Console.WriteLine("\r\nDevice endpoint list\r\n--------------------");
IReadOnlyCollection<UsbEndpointInfo> endpointList = usbInterfaceInfo.EndpointInfoList;
foreach (UsbEndpointInfo usbEndpointInfo in endpointList) {
Console.WriteLine("{0}", usbEndpointInfo.ToString());
}
}
}
usbDevice.Close();
}
Console.WriteLine("\r\n----- Device information finished -----\r\n");
}
Console.WriteLine("Trying to find our device: {0} {1}", VendorID, ProductID);
UsbDeviceFinder usbDeviceFinder = new UsbDeviceFinder(VendorID, ProductID);
// This does not work !!! WHY ?
usbDevice = UsbDevice.OpenUsbDevice(usbDeviceFinder);
if (usbDevice != null) {
Console.WriteLine("OK");
} else {
Console.WriteLine("FAIL");
}
UsbDevice.Exit();
Console.Write("Press anything to close");
Console.ReadKey();
}
}
}
Вот вывод этой программы
Found 2 devices
Got device: Van Ooijen Technische Informatica - USBasp
----- Device information finished -----
Got device: Van Ooijen Technische Informatica - USBasp
Device Information
------------------
Length:18
DescriptorType:Device
BcdUsb:0x0110
Class:VendorSpec
SubClass:0x00
Protocol:0x00
MaxPacketSize0:8
VendorID:0x16C0
ProductID:0x05DC
BcdDevice:0x0103
ManufacturerStringIndex:1
ProductStringIndex:2
SerialStringIndex:0
ConfigurationCount:1
ManufacturerString:www.fischl.de
ProductString:USBasp
SerialString:
VID & PID: 5824 1500
Device configuration
--------------------
Length:9
DescriptorType:Configuration
TotalLength:18
InterfaceCount:1
ConfigID:1
StringIndex:0
Attributes:0x80
MaxPower:25
ConfigString:
Device interface list
---------------------
Length:9
DescriptorType:Interface
InterfaceID:0
AlternateID:0
EndpointCount:0
Class:PerInterface
SubClass:0x00
Protocol:0x00
StringIndex:0
InterfaceString:
Device endpoint list
--------------------
----- Device information finished -----
Trying to find our device: 5824 1500
FAIL
Press anything to close
То, что я хотел бы получить, это простой код для обнаружения этого устройства, которое присутствует (поскольку простая итерация по всем устройствам находит его, и другой инструмент "USB Cfg Interrogator" также находит его). Об этом уже спрашивали, но конструктивного ответа не было.
Я также мог бы использовать библиотеку libusb-win32 C++ и создать для нее некоторые обертки C#, но если она не нужна, и я могу использовать библиотеку LibUsbDotNet, я бы хотел использовать ее вместо создания оберток самостоятельно.
2 ответа
То, что я хотел бы получить, это простой код для обнаружения этого устройства, которое присутствует
У вас уже есть это. Есть только один, для которого usbRegistry.Open()
на самом деле работает. Там не должно быть никакого другого устройства - проверьте, что вы используете последнюю версию libusb-win32 (1.2.6.0
в это время).
UsbDeviceFinder
Кажется, есть проблема с этим фантомным устройством.
Вы можете попробовать мастер фильтров для установки фильтра устройств.