使用LibUsb在Java中通过USB发送数据时出错(未找到实体)

使用LibUsb在Java中通过USB发送数据时出错(未找到实体),java,usb,communication,libusb,Java,Usb,Communication,Libusb,我尝试使用LibUsb4Java通过USB发送数据,但在传输过程中出现错误。我找不到错误,请求您的帮助 第一个方法返回目标设备。这是一个frdm板 尝试在bulkTransfer方法中发送数据时出现错误“USB错误5:控制传输失败:找不到实体” 有什么问题吗 我正在开发OSX v10.10(约塞米蒂): //创建libusb上下文 上下文=新上下文(); //初始化libusb上下文 int result=LibUsb.init(上下文); 如果(结果

我尝试使用LibUsb4Java通过USB发送数据,但在传输过程中出现错误。我找不到错误,请求您的帮助

第一个方法返回目标设备。这是一个frdm板

尝试在bulkTransfer方法中发送数据时出现错误“USB错误5:控制传输失败:找不到实体”

有什么问题吗

我正在开发OSX v10.10(约塞米蒂):

//创建libusb上下文
上下文=新上下文();
//初始化libusb上下文
int result=LibUsb.init(上下文);
如果(结果<0)
{
抛出新的libusbeexception(“无法初始化libusb”,结果);
}
//阅读USB设备列表
设备列表=新设备列表();
结果=LibUsb.getDeviceList(上下文,列表);
如果(结果<0)
{
抛出新的LibUsbException(“无法获取设备列表”,结果);
}
尝试
{
//迭代所有设备并列出它们
用于(设备:列表)
{
DeviceDescriptor描述符=新的DeviceDescriptor();
结果=LibUsb.getDeviceDescriptor(设备,描述符);
如果(结果<0)
{
抛出新libusbeexception(
“无法读取设备描述符”,结果);
}
if(descriptor.idVendor()==0x1357&&descriptor.idProduct()==0x0089)
{
frdboard=设备;
}
}
DeviceHandle=新的DeviceHandle();
int resultOpen=LibUsb.open(frdboard,handle);
if(resultOpen!=LibUsb.SUCCESS)
抛出新的LibUsbException(“无法打开USB设备”,resultOpen);
尝试
{
ByteBuffer缓冲区=ByteBuffer.allocateDirect(8);
put(新字节[]{1,2,3,4,5,6,7,8});
IntBuffer transfered=IntBuffer.allocate(1);
字节端点=(字节)LibUsb.getDeviceAddress(frdBoard);
int intResult=LibUsb.bulkTransfer(句柄、端点、缓冲区、已传输、1L);
试一试{
if(intResult!=LibUsb.SUCCESS)
抛出新的libusbeexception(“控制传输失败”,intResult);
}
捕获(例外e)
{
e、 printStackTrace();
}
}
最后
{
LibUsb.close(手柄);
}
}
最后
{
LibUsb.freeDeviceList(list,true);
}

遵循《快速入门指南》,我认为您错过了获取界面的机会。在“同步I/O”一节中,指南说

此示例使用控制传输向声明的接口发送8个字节:

声称该设备可以解决您的问题:

result = LibUsb.claimInterface(handle, interfaceNumber);
if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to claim interface", result);
如果设备已经由内核驱动程序注册,请记住分离设备。这个改编自《快速入门指南》的解决方案在Ubuntu 14.04上适用于我:

 boolean detach = (LibUsb.kernelDriverActive(handle, 0) == 1);
 if (detach) {
     result = LibUsb.detachKernelDriver(handle,  interfaceNumber);
     if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to detach kernel driver", result);
 }

谢谢你,正如你所说的,我忘了申请接口。这解决了问题我在声明接口时遇到此错误。未找到实体,无法声明接口。您似乎也必须将0作为接口值。对我来说,如果我输入除0以外的任何其他值,它都不起作用。
 boolean detach = (LibUsb.kernelDriverActive(handle, 0) == 1);
 if (detach) {
     result = LibUsb.detachKernelDriver(handle,  interfaceNumber);
     if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to detach kernel driver", result);
 }