如何解决从Android USB附件读取数据的更好方法
我正在用Java编写一个Android应用程序,该应用程序使用Android附件API与USB附件通信。
google documentation并没有提供实际读写数据的示例,仅提供了如何打开附件进行通信的示例。
它也陈述了两件事:
- 通信应在后台线程中进行,而不是在UI线程中进行。
- 读取缓冲区的长度至少应为16384字节,因为这是Android Open Accessory协议的最大消息长度。
我实现了这样的阅读方式:
/** boiler plate from example docs: **/
fileDescriptor = usbManager.openAccessory(accessory);
if (fileDescriptor != null) {
FileDescriptor fd = fileDescriptor.getFileDescriptor();
inputStream = new FileInputStream(fd);
readBuffer = new byte[16384];
// ... some more code that is not relevant for reading data ... //
}
/** my code in separate thread: **/
int read;
while ((read = inputStream.read(readBuffer)) >= 0) {
// ... parse message and do stuff with it ... //
}
此代码有效,并且我从附件中获取了正确的数据,但它为我的应用程序逻辑带来了问题:
- 读取功能可以无限期地阻止等待更多数据。
- 它有时会在缓冲区中背对背返回多个消息,因此我不知道何时或如何确定附件已完成发送,应该返回累积的字节。
- 我还需要将数据发送到附件,但是从两个单独的线程读取和写入USB会导致错误。
我无法控制附件上运行的代码,它是封闭产品,但是我知道它的协议:它发送带有2个字节的前缀消息,指示消息的大小。
所以,我尝试了:
read = inputStream.read(readBuffer,2);
if (read == 2) {
int size = (readBuffer[0] & 0xff) + ((readBuffer[1] & 0xff) << 8);
read = inputStream.read(readBuffer,2,size);
}
第一次读取返回预期的消息大小,但是第二次读取始终抛出java.io.IOException: read Failed: EIO (I/O error)
我还尝试使用available()
方法,然后再调用read
尝试找出可以读取多少字节,但这会引发IllegalArgumentException
异常。
所以我的问题是:
除了盲目地给read
函数提供最大缓冲区并等待其返回之外,还有其他方法可以从Android附件读取数据吗?
如果不是,是否至少有一种方法可以使read
函数超时,如果在指定的时间范围内未收到任何字节?
是否有一种方法可以直接使用Android配件上的批量传输API(Android USB Host API允许的方式)?
如果不可能,那么确保对附件的读写操作不会互相干扰的正确逻辑是什么?
我正在使用的协议不能保证一对一的来回发送和接收。 附件可以随时接收用户输入并将其发送到Android设备,即使没有从附件接收到数据,Android设备也需要将数据发送到附件,因此简单的互斥体将无法使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。