You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:02:04