使用usb4java读取USB数据异常:无返回/缓冲区有长度无字节原因
USB设备读取问题分析
一、无数据返回的可能原因
- 端点匹配错误:检查
findBulkInEndpoint方法是否正确识别BULK IN端点——USB端点地址的最高位为1表示IN方向(设备→主机),如果方法只判断传输类型为BULK但未校验方向,会导致读取错误端点。 - 设备未配置:多数USB设备需要先调用
LibUsb.setConfiguration设置设备配置,代码中缺少这一步,设备可能处于未激活状态,无法传输数据。 - 接口备用设置未切换:部分设备存在多个接口备用设置,仅调用
claimInterface可能不够,需通过LibUsb.setInterfaceAltSetting切换到对应的数据传输备用设置。 - 未触发设备输出数据:有些设备需要主机先发送指令才会返回数据,代码仅循环读取,未向设备发送触发命令,自然无数据返回。
- 权限或驱动问题:Linux/macOS下需配置udev规则赋予设备访问权限;Windows下需安装WinUSB等兼容libusb的驱动,权限不足或驱动不匹配会导致读取失败。
二、transferred有值但缓冲区空的原因
核心问题是直接ByteBuffer的position/limit未正确更新:
代码中使用BufferUtils.allocateByteBuffer创建的是直接缓冲区,libusb在Native层写入数据后,不会自动同步Java层ByteBuffer的position和limit标记。
你调用buffer.flip()的逻辑错误:flip()是将limit设为当前position、position设为0,而此时Java层ByteBuffer的position仍是初始值0,因此flip()后limit被设为0,调用buffer.get()自然抛出BufferUnderflowException。
修复方法
移除buffer.flip(),改为手动设置缓冲区的limit为读取到的字节数:
int len = transferred.get(); System.out.println("Read " + len); // 移除buffer.flip(),添加以下代码 buffer.limit(len); byte[] bytes = new byte[len]; buffer.get(bytes, 0, len);
内容的提问来源于stack exchange,提问作者Sj Ma
相关产品推荐
相关产品推荐

