在 Android 中从 USB 串口读取数据
reading data from usb serial port in Android
我使用 prolifit PL23023 芯片向我的 android 应用发送和接收数据。我处理了关于 pl2303 的驱动程序,我可以通过串口写入和读取数据。但问题是当我收到一个 15 字节的数据时,它读入了一个 11 字节的数据和一个 4 字节的数据。没有数据丢失,它给了我所有数据,但在一个 11 字节的数据包中。
我控制了所有关于缓冲区大小的事情,看起来没问题。
这是读取数据的方法:
@Override
public int read(byte[] dest, int timeoutMillis) throws IOException {
// synchronized (mReadBufferLock) {
int readAmt = Math.min(dest.length, mReadBuffer.length);
int numBytesRead = mConnection.bulkTransfer(mReadEndpoint, mReadBuffer,
readAmt, timeoutMillis);
if (numBytesRead < 0) {
return 0;
}
System.arraycopy(mReadBuffer, 0, dest, 0, numBytesRead);
return numBytesRead;
//}
}
bulkTransfer() 方法最终在本机方法中执行,我们不知道 bulkTransfer() 中发生了什么。
关于此功能的有趣之处在于,当我在这一行的第一行放置一个断点时。
int numBytesRead = mConnection.bulkTransfer(mReadEndpoint, mReadBuffer,
readAmt, timeoutMillis);
和运行调试模式下的程序,15字节示例中的numBytesRead值设置为15,一切正常!我不知道发生了什么。在调试模式下,我可以获得超过 11 字节的数据包,但在正常模式下,我只能获得 11 字节的数据包。
制度没有错,只是期望错了。这是串口的本质 - 数据到达源发送它的时间,这可能是使线路完全忙碌的时间,或者可能是字符之间 年 。
独立于此,您的 USB 实现会查询 USB 转换器芯片以获取它收到的任何数据,并且它会为您提供到那时为止的任何数据。它无法知道是否有更多来自源头的消息,因此它只会为您提供到那时它所拥有的内容。
如果您想可靠地获得完整的"messages",您将需要继续阅读并连接结果,直到达到定义[=23]结尾的任何条件=] 给你 - 例如,一个换行符。 (这可能意味着一次读取包含一条消息的结尾和下一条消息的开始。)如您所见,放慢程序速度可以增加在 "message" 处收到完整 "message" 的机会第一次读取时转换器,但这不可靠(还请记住,在此模式下一次 USB 读取的最大数据量相当小)。
通常您可以在一个循环中执行此读取操作,但请注意 Android 您不得在 UI 线程上执行阻塞操作,因此您可能需要在一个循环中执行此收集操作后台线程。
我使用 prolifit PL23023 芯片向我的 android 应用发送和接收数据。我处理了关于 pl2303 的驱动程序,我可以通过串口写入和读取数据。但问题是当我收到一个 15 字节的数据时,它读入了一个 11 字节的数据和一个 4 字节的数据。没有数据丢失,它给了我所有数据,但在一个 11 字节的数据包中。 我控制了所有关于缓冲区大小的事情,看起来没问题。 这是读取数据的方法:
@Override
public int read(byte[] dest, int timeoutMillis) throws IOException {
// synchronized (mReadBufferLock) {
int readAmt = Math.min(dest.length, mReadBuffer.length);
int numBytesRead = mConnection.bulkTransfer(mReadEndpoint, mReadBuffer,
readAmt, timeoutMillis);
if (numBytesRead < 0) {
return 0;
}
System.arraycopy(mReadBuffer, 0, dest, 0, numBytesRead);
return numBytesRead;
//}
}
bulkTransfer() 方法最终在本机方法中执行,我们不知道 bulkTransfer() 中发生了什么。
关于此功能的有趣之处在于,当我在这一行的第一行放置一个断点时。
int numBytesRead = mConnection.bulkTransfer(mReadEndpoint, mReadBuffer,
readAmt, timeoutMillis);
和运行调试模式下的程序,15字节示例中的numBytesRead值设置为15,一切正常!我不知道发生了什么。在调试模式下,我可以获得超过 11 字节的数据包,但在正常模式下,我只能获得 11 字节的数据包。
制度没有错,只是期望错了。这是串口的本质 - 数据到达源发送它的时间,这可能是使线路完全忙碌的时间,或者可能是字符之间 年 。
独立于此,您的 USB 实现会查询 USB 转换器芯片以获取它收到的任何数据,并且它会为您提供到那时为止的任何数据。它无法知道是否有更多来自源头的消息,因此它只会为您提供到那时它所拥有的内容。
如果您想可靠地获得完整的"messages",您将需要继续阅读并连接结果,直到达到定义[=23]结尾的任何条件=] 给你 - 例如,一个换行符。 (这可能意味着一次读取包含一条消息的结尾和下一条消息的开始。)如您所见,放慢程序速度可以增加在 "message" 处收到完整 "message" 的机会第一次读取时转换器,但这不可靠(还请记住,在此模式下一次 USB 读取的最大数据量相当小)。
通常您可以在一个循环中执行此读取操作,但请注意 Android 您不得在 UI 线程上执行阻塞操作,因此您可能需要在一个循环中执行此收集操作后台线程。