LibUsbDotNet Win32Error: Код ошибки 87

У меня проблема с устройством USB. Я разрабатываю приложение на C#, которое связывается с этим устройством. Для этого я использую библиотеку LibUsbDotNet. Проблема в следующем, мое общение прекрасно работает на многих компьютерах в моей компании. Но есть другие (два компьютера до сих пор), которые просто не работают. В них, когда я пытаюсь записать на устройство, я получаю Win32Error: Код ошибки 87 (неверный параметр). Странно то, что я использую тот же драйвер, что и на других компьютерах. Они даже используют ту же ОС (Windows 8). Этот драйвер, который я создал с помощью "Мастера установки драйверов", входит в комплект UsbK Development Kit. Я использовал UsbK для создания драйвера, потому что они используют более новую версию драйвера libusb. У меня есть другие устройства, с которыми я делал то же самое, и все они работают нормально, только это вызывает у меня головную боль. Исследуя проблему, я нашел программное обеспечение Usblyzer. Запустив его и проанализировав информацию моего устройства при подключении к ПК, я обнаружил, что количество открытых каналов равно 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);
}

0 ответов

Другие вопросы по тегам