我遇到USB设备问题。我正在用C#开发一个与该设备通信的应用程序。为了进行这种通信,我使用的是LibUsbDotNet库。 问题如下,我的沟通在我公司的许多计算机上完美运行。但是还有其他人(直到现在两台电脑)它才行不通。在这些中,当我尝试写入设备时,它给我一个Win32Error:错误代码87(无效参数)。 奇怪的是,我使用的是与其他计算机中使用的驱动程序相同的驱动程序。他们甚至使用相同的操作系统(Windows 8)。 我使用UsbK开发套件附带的“Driver Install Creator Wizard”创建的这个驱动程序。我使用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);
}