如何在Linux中有效地等待RS232的CTS或DSR?

时间:2012-01-21 09:55:07

标签: c++ c linux serial-port wait

目前,我正在通过以下方式读取串口的CTS和DSR信号:

bool get_cts(int fd) {
    int s;
    ioctl(fd, TIOCMGET, &s);
    return (s & TIOCM_CTS) != 0;
}

现在我想等到get_cts()返回true。一个简单的循环不是我认为的最佳解决方案(因为它非常耗费资源)。

void wait_cts(int fd) {
    while(1) {
        if(get_cts(fd)) {
             return;
        }
    }
}

在Linux上使用C或C ++有更好的解决方案吗? (我不能使用任何硬件流控制,因为我根本不需要串行数据线。)

2 个答案:

答案 0 :(得分:8)

ioctl TIOCMIWAIT会阻塞,直到给定的一组信号发生变化。

可悲的是,tty_ioctl(4)页面和ioctl_list(4)中没有记录此ioctl。

我在这个问题中已经了解了这个ioctl:

Python monitor serial port (RS-232) handshake signals

答案 1 :(得分:1)

select系统调用适用于类似的应用程序。您可以进行其他工作或睡眠,然后定期检查FD_SET的状态。如果您的程序除了获取数据之外什么都不做,那对于您正在做的事情甚至可能有点过分。