Android在USB附件模式下无法接收512bytes的数据

时间:2018-08-10 03:37:12

标签: android usb accessory

当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();
    }
}

这不仅发生在512bytes,还发生了其他一些特定的长度(512bytes,1024bytes,2048byte ...)。 这是Android配件模式的错误吗?

有人知道这个问题吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

如果您恰好发送了512个字节,则接收方不知道您已完成事务或剩余数据(在其他程序包中),因此它将一直等待并冻结。因此,对于长度为缓冲区大小倍数的长度(高速为512,全速为64),您需要发送一个额外的零长度包以完成USB传输。