我使用prolifit PL23023芯片发送和接收数据到我的Android应用程序。我处理了关于pl2303的驱动程序,我可以通过串口写入和读取数据。但问题是,例如我收到一个15字节的数据,它读取11字节数据和4字节数据。没有数据丢失,它给我所有的数据,但在11byte数据包。 我控制了缓冲区大小的所有事情,似乎没问题。 这是读取数据的方法:
@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个字节的数据包。
答案 0 :(得分:3)
系统没有任何问题,只有期望。这是串行端口的本质 - 数据在源发送它的时间到达,这可能是使线路保持完全忙碌的时间,或者在字符之间可能年。
独立于此,您的USB实现会向USB转换器芯片查询它收到的任何数据,它将为您提供截至当时的任何数据。它无法知道是否有更多的信息来自源头,所以它只是提供了它到那时为止的内容。
如果您希望可靠地获取完整的“消息”,您需要继续阅读并连接结果,直到达到为您定义“消息”结束的任何条件 - 例如,换行符。 (这可能意味着一次读取包含一条消息的结束和下一条消息的开始。)如您所见,减慢程序速度可能会增加转换器接收到完整“消息”的可能性。您第一次读取时的时间,但这不可靠(还要记住,在此模式下,一次USB读取的最大数据量相当小)。
通常你可以在循环中读取这个内容,但要注意Android上你不能在UI线程上执行阻塞操作,所以你可能需要在后台线程中执行这个集合。