我正在编写软件平板电脑之间进行通信(摩托罗拉 Xoom,Android 版本 4.0.3,内核版本 2.6.39.4)以及使用 USB Host API 的外围设备由安卓提供。我只使用两种类型的通信:
-
control:
controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
-
bulk:
bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)
控制传输工作正常,但我有批量传输的问题。我只能使用 32768 作为bulkTransfer 函数的缓冲区大小。不能少用或多用。我知道由于缓冲管道的限制(大小:32769 字节),我不能使用更多。
该外围设备传输bulkTranfer 函数未正确读取的数据。我想有些数据丢失了。
我发现这个:在 Linux 中,如果进程尝试从空管道(缓冲区)读取数据,则 read(2) 将阻塞,直到数据可用。如果进程尝试写入完整的管道,则 write(2) 会阻塞,直到从管道读取足够的数据以允许写入完成。 http://www.kernel.org/doc/man-pages/online/pages/man7/pipe.7.html
基于此,我对问题的解释是,由于 write(2) 函数创建的阻塞标志,某些数据未写入管道(缓冲区)。我对么?如果这是真的我可以改变管道缓冲区。
- 我对这个问题的第一个解决方案是更大的缓冲区。为了
kernel >= 2.6.35,您可以使用以下命令更改管道的大小fcntl(fd, F_SETPIPE_SZ, size) https://stackoverflow.com/questions/4739348/is-it-possible-to-change-the-size-of-a-named-pipe-on-linux但我怎样才能找到
fd
(文件描述符)对于
USB 管道?
- 第二个选项是使用
ulimit -p SIZE
但参数p
因为我的内核不是用于管道而是用于进程。
有没有人遇到同样的问题,有解决办法吗?
你应该买一个USB数据分析仪,我用的是这个:http://www.ellisys.com/products/usbex200/index.php http://www.ellisys.com/products/usbex200/index.php
当我做同样类型的事情时,使用这样的东西确实对我有帮助,我发现你必须做某种类型的 while 循环。
对于我的设备,我有 64 字节的数据以数据包的形式发送给我,该数据包将是两个控制字节和 62 个数据字节,因此对于我的传输,我必须执行类似的操作
StringBuilder sb = new StringBuilder();
while(bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout) > 2){
for(int i = 2; i < buffer.length(); i++){
sb.append((char) buffer[i]);
}
}
这些行很长,对我来说很有用,我遇到了完全相同的问题,这就是我解决它的方法。如果您需要的话,我有更多信息。只是评论:)。我知道这对我来说真的很令人沮丧。我使用的是带有 Android 4.0.3 的 Acer Iconia A500 顺便说一句
USB 传输大量数据 https://stackoverflow.com/questions/10931558/transferring-larger-amounts-of-data-usb
USB 传输数据 https://stackoverflow.com/questions/10429615/transferring-data-usb
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)