gpt4 book ai didi

java - Android中从USB串口读取数据

转载 作者:行者123 更新时间:2023-12-01 21:54:34 25 4
gpt4 key购买 nike

我使用 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);

并在 Debug模式下运行程序,15字节示例中的numBytesRead值设置为15,一切正常!我不知道发生了什么事。在 Debug模式下我可以获得超过 11 字节的数据包,但在正常模式下我只能获得 11 字节的数据包。

最佳答案

系统没有任何问题,只是期望有问题。这就是串行端口的本质 - 数据按照源发送数据的时间到达,这可能是使线路完全繁忙的时间,也可能是字符之间的

与此无关,您的 USB 实现会向 USB 转换器芯片查询其收到的任何数据,并且它将向您提供当时为止的所有数据。它无法知道是否有更多信息正在从源头发出,因此它只能向您提供截至该时间的信息。

如果您想可靠获得完整的“消息”,您将需要继续阅读并连接结果,直到达到为您定义“消息”结束的任何条件 - 例如,换行符。 (这可能意味着一次读取包含一条消息的结束和下一条消息的开始。)正如您所看到的,减慢程序速度可以增加转换器接收到完整“消息”的机会第一次读取的时间,但这并不可靠(另请记住,在此模式下一次 USB 读取的最大数据大小相当小)。

通常您可以在循环中执行此读取操作,但请注意,在 Android 上,您不得在 UI 线程上执行阻塞操作,因此您可能需要在后台线程中执行此收集操作。

关于java - Android中从USB串口读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com