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

标签 java android serial-port usb

我使用 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/

相关文章:

java - 在 Java 中使用跨多个类的扫描器?

java - Eclipse - 提取具有相似变量名的常量时出现错误建议

java - Android Studio 错误 : org. gradle.process.internal.ExecException

发送包含超过一定大小的字节数据的对象时出现Java StreamCorruptedException

android - 更改安卓 :minSdkVersion Has No Effect

Linux TTY 和驱动程序

windows - 如何获取 VCOM 设备 (Windows) 的 USB 字符串描述符?

c++ - 无法通过串行重复写入字符串

Java泛型在基类中初始化子类

java - JPA - 抽象基实体类中的多对多关系和具体扩展实体子类中的连接表引用