我正在编写软件,用于在Android 4.0.3版本和内核版本2.6.39.4的Motorola Xoom平板电脑与使用Android提供的USB主机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)
控制传输正常工作,但是批量传输存在问题。对于bulkTransfer函数,我只能使用32768作为缓冲区的大小。不能使用更少或更多。我知道不能使用更多,因为缓冲管道的限制(大小为32769字节)。
该外设设备流式传输数据,但bulkTransfer函数无法正确读取数据。我猜测有些数据丢失了。
I find this: 在Linux中,如果一个进程试图从空管道(缓冲区)读取数据,则read(2)将阻塞,直到有数据可用。如果一个进程试图向满管道写入数据,则write(2)将阻塞,直到从管道中读取了足够的数据以允许写入完成。
第二个选项是使用
有人遇到过同样的问题吗?有什么解决方案吗?
- 控制:controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout) - 批量:bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)
控制传输正常工作,但是批量传输存在问题。对于bulkTransfer函数,我只能使用32768作为缓冲区的大小。不能使用更少或更多。我知道不能使用更多,因为缓冲管道的限制(大小为32769字节)。
该外设设备流式传输数据,但bulkTransfer函数无法正确读取数据。我猜测有些数据丢失了。
I find this: 在Linux中,如果一个进程试图从空管道(缓冲区)读取数据,则read(2)将阻塞,直到有数据可用。如果一个进程试图向满管道写入数据,则write(2)将阻塞,直到从管道中读取了足够的数据以允许写入完成。
基于此,我的问题解释是由于write(2)函数的阻塞标志而导致某些数据未被写入管道(缓冲区)。我理解正确吗?如果是这样,我可以更改管道缓冲区。
我的第一个解决方案是增加缓冲区大小。对于内核版本 >= 2.6.35,您可以使用fcntl(fd, F_SETPIPE_SZ, size)
更改管道的大小,但我如何找到USB管道的fd
(文件描述符)?第二个选项是使用
ulimit -p SIZE
,但我的内核中参数p
不是用于管道而是进程。有人遇到过同样的问题吗?有什么解决方案吗?