1

我有用于 AVR 微控制器的 usbasp 编程器。这个程序员使用 libusb 库。我设法将它连接到电脑,系统检测到新设备,我设法为这个设备安装驱动程序。它运行良好,因为我可以用它对 AVR 芯片进行编程。所以硬件部分是 100% OK。

现在软件部分:使用 LibUsbDotNet 对我的 libusb-win32 设备进行简单迭代,我找到了 2 个设备。它们都命名相同(并且具有相同的 VID 和 PID),所以我认为这是复合设备。第二个有一些数据。这在下面的屏幕截图中得到了很好的展示。

USB1

USB2

USB3

和代码(它只是从示例中复制粘贴)

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 询问器”也找到了它)。以前有人问过这个问题,但没有建设性的答案。

我也可以使用 libusb-win32 c++ 库并为其创建一些 C# 包装器,但如果不需要它并且我可以使用 LibUsbDotNet 库,我想使用它而不是自己创建包装器。

4

2 回答 2

1

我想得到的是这个简单的代码来检测这个存在的设备

你几乎已经有了。只有一个usbRegistry.Open()真正有效。应该没有其他设备 - 检查您是否使用最新的 libusb-win32 版本(1.2.6.0此时)。

UsbDeviceFinder这个幻象设备似乎有问题。

于 2014-07-27T06:45:07.827 回答
0

您可以尝试过滤向导安装设备过滤器。

于 2015-09-20T20:35:29.407 回答