【问题标题】:Access serial port (/dev/tty*) incoming data without polling无需轮询即可访问串行端口 (/dev/tty*) 传入数据
【发布时间】:2012-10-16 02:45:48
【问题描述】:

我用姜饼。我已经与本地串行端口(RS-232 本地 UART,而不是 USB 加密狗)交谈。这是通过 java.io 和一小段用 C 编写的本地代码来打开和关闭流并配置波特率来完成的。它有效,但我的第一个想法是它效率不高,因为我需要设置一个线程来不断轮询输入流以检查是否有来自串行端口的字节。使用 CPU 和电池的方式真是太浪费了。

    private InputStream mInputStream;
private ReadThread mReadThread;

private class ReadThread extends Thread {

    @Override
    public void run() {
        super.run();
        while(!isInterrupted()) {
            int size;
            try {
                byte[] buffer = new byte[64];
                if (mInputStream == null) return;
                size = mInputStream.read(buffer);
                if (size > 0) {
                    onDataReceived(buffer, size);
                }
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
        }
    }
}

我认为我需要做的是拥有与 android 中的其他事件相同类型的信号,我可以在其中设置某种侦听器,让我知道一些字节的到来并唤醒我的线程,这将照顾传入的数据。我在 API 中没有找到类似的东西。

但是,在寻找和研究更多之后,最后,我认为这并不浪费,但我希望了解线程在 Android 中如何工作的人的意见。让我们看一下代码行。

size = mInputStream.read(buffer);

实际上是阻塞读取。我查看了设备是如何打开的,它是通过 NDK/JNI 接口在 C 中完成的,它在没有标志“NOBLOCK/NODELAY”的情况下打开。因此,它不应该在 while 循环中不断旋转,而只是在 mInputStream.read 上被阻塞,并且内核应该切换到另一个线程,直到有一些数据可供读取。在这种情况下,这段代码完全没问题。这个假设是真的吗?

我想知道,因为我的嵌入式系统的主要目的是大多数时间显示视频,我不希望我在幕后管理的内容占用大量资源并在视频中出现一些问题回放。

【问题讨论】:

    标签: android multithreading serial-port


    【解决方案1】:

    在编写应用程序和测试之后,我可以说问题中的最后一个假设实际上是正确的。如果设备在没有标志“NOBLOCK/NODELAY”的情况下打开,线程将在 mInputStream.read() 上挂起,直到有可用数据。没有浪费的投票。

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 2016-03-26
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      相关资源
      最近更新 更多