我正在尝试使用 ioctl 和 USBDEVFS_BULK(在 Android 上 native )读取 USB。我使用的 USB 电缆包含一个 FTDI 芯片,并从 Arduino UNO 发送数据,该 Arduino UNO 写入串行。
Android 上的写入似乎总是成功,但读取要么总是失败,要么在一些条目上成功,然后不断失败,并显示“值对于定义的数据类型来说太大”(75)。我使用这个设置进行一个简单的 ping 测试:在 Android 上写入一个字节,一个序列号; Arduino 读取字节并回复相同的序列号。
我不完全确定这个错误的含义。我的理解是设备发送的数据多于我传递给 ioctl 的缓冲区可以容纳的数据。我已确保我的 Arduino 仅发送回 1 个字节,并且我预计 FTDI 会再发送 2 个字节,总共 3 个字节。即使增加缓冲区大小似乎也无法解决问题。
char mReadData[3];
struct usbdevfs_bulktransfer bulkTransferRead = {
mReadEndpoint, // Endpoint
3, // Length in bytes
0, // Timeout (ms)
mReadData, // Data
};
ret = ioctl(mFd, USBDEVFS_BULK, &bulkTransferRead);
这是我 native 使用的代码。如果我尝试使用 Android/Java 代码进行读取和写入(使用bulkTransfer()),我会看到与读取相同的间歇性问题。在 Android 上的 Java 中,我确保在任何写入/读取之前执行以下操作:
1) 复位引脚 2)设置波特率 3)8N1
任何人都可以帮我描述一下我对 FTDI/USB 的误解,或者解释一下关于“值对于定义的数据类型来说太大”的错误吗?
最佳答案
我找到了解决方案。看来这个错误 EOVERFLOW 可以通过指定等于端点最大数据包大小的缓冲区大小来修复。这解决了我的问题。
关于android - 使用 ioctl 读取 USB 失败,原因为 "value too large for defined data type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27370923/