我正在编写软件来平板电脑(摩托罗拉Xoom与Android版本4.0.3和内核版本2.6.39.4)和使用 Android提供的USB Host API的外围设备之间进行通信.我只使用两种类型的通信:
controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)控制传输工作正常,但我有批量传输的问题.我只能使用32768作为bulkTransfer函数的缓冲区大小.不可能使用更少或更多.我知道由于缓冲管的限制(大小:32769字节),我不能使用更多.
此外围设备流式传输bulkTranfer功能未正确读取的数据.我想有些数据会丢失.
我发现:在Linux中如果进程尝试从空管道(缓冲区)读取,则read(2)将阻塞,直到数据可用.如果进程尝试写入完整管道,则写入(2)块,直到从管道读取足够的数据以允许写入完成.
基于此,我对该问题的解释是由于write(2)函数产生的阻塞标志,某些数据不会写入管道(缓冲区).我对么?如果这是真的,我可以改变管道缓冲区.
fcntl(fd, F_SETPIPE_SZ, size)但是如何找到fdUSB管道的(文件描述符)?ulimit -p SIZE但p我的内核的参数不是管道而是进程.有没有人遇到同样的问题,任何解决方案?
你应该买一个 USB 数据分析仪,我正在使用这个: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]);
}
}
Run Code Online (Sandbox Code Playgroud)
这些行很长,对我来说很有用,我遇到了完全相同的问题,这就是我解决它的方法。如果您需要的话,我有更多信息。只是评论:)。我知道这对我来说真的很令人沮丧。我使用的是带有 Android 4.0.3 的 Acer Iconia A500 顺便说一句
| 归档时间: |
|
| 查看次数: |
17106 次 |
| 最近记录: |