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);
}