【问题标题】:How can I determine the length of received bytes of UsbRequest.queue(..) method?如何确定 UsbRequest.queue(..) 方法接收字节的长度?
【发布时间】:2011-10-18 10:31:47
【问题描述】:

我在使用 Android 3.1 中的 UsbRequest 类时遇到问题。

这是我的代码:

ByteBuffer buffer = ByteBuffer.allocate(4096);
buffer.order(ByteOrder.LITTLE_ENDIAN);
UsbRequest request = new UsbRequest();
request.initialize(mConnection, mEndpointIn);
request.queue(buffer, 4096);

if (mConnection.requestWait() == request) {
   byte[] data = buffer.array();
}

数组data的大小为4096,但实际接收到的字节长度要小得多。

如何确定实际接收到的字节大小?

谢谢。

【问题讨论】:

    标签: android usb communication bytebuffer


    【解决方案1】:

    我相信buffer.limit() 应该返回接收到的字节数。这行得通吗?

    【讨论】:

    • 你好,不。在我的例子中,限制是 4096。这是缓冲区的限制。
    • 啊。诡异的。试试buffer.position()?我的理解是limitcapacity不一样,但我想我错了。
    • 没有。职位是0。这里所有的变量:_elementSizeShift=0, capacity=4096,effectiveDirectAddress=0, limit = 4096, mark = -1, offset=0, position =0
    【解决方案2】:

    在我看来,当前的异步 USB API 没有办法返回读取大小。 2“解决方法”使用同步传输,因为您在那里收到读取/写入的字节数,或者您正在实施的协议可能会向您发送您将收到的字节数。例如。我目前正在实现一些东西,我收到的每个更高级别的数据包在数据包的前 4 个字节中都有字节数。根据这个数字,我知道我是否需要进行多次读取。

    【讨论】:

      【解决方案3】:

      您可以使用request.queue(buffer, bufferLength);。这应该可以解决您的问题。现在,您应该参考 android 文档,它有据可查且很有帮助。

      【讨论】:

      • 链接已损坏,@Slava 已经在使用该方法
      • 我早在 2012 年 10 月 31 日就回答了这个问题,当时这个链接工作正常,据我所知,我在 API 16 生效时回答了这个问题。顺便说一句,这是一个阻塞队列,它会等到 bufferLength 数量可用。
      • 你应该修复你的链接
      【解决方案4】:

      这是bug in Android。在受影响的版本上,没有解决方法,因为实现根本没有超过长度。

      在 JB-MR1(API 级别 17 及以上)中为 fixed

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-07
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多