【问题标题】:android can not receive a data of 512bytes in usb Accessory modeandroid在usb附件模式下无法接收512bytes的数据
【发布时间】:2019-01-17 14:27:07
【问题描述】:

android 通过usb 附件模式与pc 通信时,如果pc 向android 发送512bytes 数据,android 将无法接收数据。 但是,如果超过(或低于)512 字节的数据传输,则没有问题。 如果 android 在接收到 512bytes 数据后接收到其他字节数据,则传入丢失的数据和其他字节数据(512bytes + 其他数据)。

我在线程上读取的代码如下。

@Override
public void run() {
    byte[] readbuffer = new byte[16384];
    int bytesRead = 0;

    try {
        while ((bytesRead = mInputStream.read(readbuffer, 0, readbuffer.length)) != -1) {
            //my code here afrer read.
            ....
            mHandler.sendMessage(msg);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这不仅发生在 512 字节,还发生在其他一些特定长度(512 字节、1024 字节、2048 字节......)。 这是android配件模式的bug吗?

有人知道这个问题吗?

【问题讨论】:

  • 你有最小的代码示例吗?
  • 我刚刚在线程上添加了我的阅读代码。我认为没有问题。 @JeroenHeier

标签: android usb accessory


【解决方案1】:

这不是 AOA 的错误,而是您的发件人没有完成 USB 交易。与 USB 控制传输不同,批量传输不传输数据大小,因此要完成批量传输,必须满足以下条件之一:

  1. 接收的数据量就是请求的数据量。
  2. 数据大小小于最大缓冲区大小。
  3. 收到零长度包。

对于高速模式,最大缓冲区大小为 512 字节,因此如果发送 0-511 字节,则满足条件 2。如果数据长度为 513-1023,它将分为两个包 512 字节 + 1-511 字节,所以最后一个包满足第二个条件。

如果您恰好发送了 512 个字节,接收方不知道您是否已完成交易或有剩余数据(在附加包中),因此它会继续等待并冻结。因此,对于缓冲区大小的倍数(高速为 512,全速为 64),您需要发送一个额外的零长度包以完成 USB 传输。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多