无需轮询即可访问串行端口(/ dev / tty *)传入数据

时间:2012-10-16 02:45:48

标签: android multithreading serial-port

我使用姜饼。我已经与本机串口(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上被阻塞,并且内核应该只切换到另一个线程,直到有一些数据可供读取。在这种情况下,这段代码将完全没问题。这个假设是真的吗?

我想知道,因为我的嵌入式系统的主要目的是在大多数时间显示视频,我不希望我在幕后管理的东西吸收大量资源并在视频中给出一些打嗝回放。

2 个答案:

答案 0 :(得分:2)

在编写应用程序和测试之后,我可以说在问题中做出的最后一个假设实际上是正确的。如果设备打开时没有标记“NOBLOCK / NODELAY”,则线程将暂停在mInputStream.read()上,直到有可用数据为止。没有浪费的民意调查。

答案 1 :(得分:0)