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