android - android在usb附件模式下无法接收512bytes的数据
问题描述
当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配件模式错误吗?
有人知道这个问题吗?
解决方案
这不是 AOA 的错误,而是您的发件人没有完成 USB 交易。与 USB 控制传输不同,大容量传输不传输数据大小,因此要完成大容量传输,必须满足以下条件之一:
- 接收的数据量是请求的数据量。
- 数据大小小于最大缓冲区大小。
- 收到一个零长度包。
对于高速模式,最大缓冲区大小为 512 字节,因此如果发送 0-511 字节,则满足条件 2。如果数据长度为 513-1023,它将被分成两个包 512 字节 + 1-511 字节,所以最后一个包满足第二个条件。
如果您恰好发送了 512 个字节,则接收方不知道您是否已完成交易或还有剩余数据(在附加包中),因此它会继续等待并冻结。因此,对于缓冲区大小的倍数(高速为 512,全速为 64),您需要发送一个额外的零长度包以完成 USB 传输。
推荐阅读
- python - Python stringTypeError:必须是 str,而不是 NoneType
- javascript - 如何从 SVG 标签内控制 HTML 元素
- rust - 如何在这个结构定义中避免 PhantomData?
- solr - SolrCloud 的 SolrJ 客户端针对响应速度进行了优化?
- swift - IOS UILabel 在我重新加载应用程序或单击其他位置之前不会更新
- graphql - 来自 withApollo HOC 的 props.client.subscribe 的 API 文档
- php - 在 Laravel 通知电子邮件中添加粗体文本和换行符
- python - 从文件夹结构备份/复制 pip 模块
- javascript - 如何为 material-ui 组件正确使用 typescript 模块扩充?
- sql - 如何将varchar转换为日期格式