1

我的 USB 设备有问题。我正在用 C# 开发一个与该设备通信的应用程序。为了进行这种交流,我使用了 LibUsbDotNet 库。问题如下,我的通信在我公司的许多计算机上都能正常工作。但是还有其他一些(直到现在有两台计算机)它就是行不通的。在这些中,当我尝试写入设备时,它给了我一个 Win32Error:错误代码 87(无效参数)。奇怪的是,我使用的驱动程序与我在其他计算机中使用的驱动程序相同。他们甚至使用相同的操作系统(Windows 8)。我使用随 UsbK 开发工具包提供的“驱动程序安装创建者向导”创建的这个驱动程序。我使用 UsbK 创建驱动程序,因为他们使用更新版本的 libusb 驱动程序。我有其他设备也做过同样的事情,它们都工作正常,只是这个让我很头疼。研究这个问题,我找到了 Usblyzer 软件。运行它并分析我的设备插入PC时的信息,我看到有问题的计算机中打开的管道数为0。在一切正常的情况下,是 3。这与问题有关吗?知道如何解决吗?

下面是我用来重现问题的小代码。原始应用程序非常大。

private void OnUsbDeviceNotify(object sender, DeviceNotifyEventArgs e)
{
    if (e.Device == null)
        return;

    int vid = e.Device.IdVendor;
    int pid = e.Device.IdProduct;

    if (vid == Vid && pid == Pid)
    {
        switch (e.EventType)
        {
            case EventType.DeviceArrival:
                ConnecDevice();
                break;
            case EventType.DeviceRemoveComplete:
                Reader = null;
                Writer = null;
                break;
        }
    }
}

private void ConnecDevice()
{
    UsbDeviceFinder usbDeviceFinder = new UsbDeviceFinder(Vid, Pid);

    UsbDevice usbDevice = UsbDevice.OpenUsbDevice(usbDeviceFinder);

    if (usbDevice == null)
        return;

    if (!usbDevice.IsOpen)
        usbDevice.Open();

    IUsbDevice iUsbDevice = (IUsbDevice)usbDevice;

    iUsbDevice.SetConfiguration(1);
    iUsbDevice.ClaimInterface(1);

    int transferLengthWrite;

    Reader = usbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
    Writer = usbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);

    ErrorCode erro = Writer.Write(ReadValuesCommand, 0, 2, WriteTimeout, out transferLengthWrite);
    Console.Write(erro);

    if (erro != ErrorCode.Success)
        return;

    Thread.Sleep(500);

    int transferLengthRead;

    byte[] values = new byte[ValuesSize];

    Reader.Read(Values, 0, ValuesSize, ReadTimeout, out transferLengthRead);

    ProcessValues(values);
}
4

0 回答 0