android无法在usb附件模式下接收512字节的数据

android无法在usb附件模式下接收512字节的数据,android,usb,accessory,Android,Usb,Accessory,当android通过usb附件模式与pc通信时,如果pc向android发送512字节的数据,android将无法接收数据。 但是,如果数据传输超过(或低于)512字节,则没有问题。 如果android在接收512字节数据之后接收到其他字节数据,则同时传入缺失数据和其他字节数据(512字节+其他数据) 我的线程读取代码如下 @Override public void run() { byte[] readbuffer = new byte[16384]; int bytesRea

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

我的线程读取代码如下

@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字节…)。 这是安卓附件模式错误吗


有人知道这个问题吗?

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

  • 接收的数据量就是请求的数据量
  • 数据大小小于最大缓冲区大小
  • 收到一个零长度的包
  • 对于高速模式,最大缓冲区大小为512字节,因此如果发送0-511字节,则满足条件2。如果数据长度为513-1023,它将被分成两个包512字节+1-511字节,因此最后一个包同样满足第2个条件


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

    您有一个最小的代码示例吗?我刚刚添加了线程上的读取代码。我认为没有问题@杰罗恩希尔