Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to efficiently wait for CTS or DSR of RS232 in Linux?

Currently, I'm reading the CTS and DSR signals of a serial port in the following way:

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

Now I'd like to wait until get_cts() returns true. A simple loop isn't the best solution I think (as it's extremely resource-intensive).

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

Is there any better solution using C or C++ on Linux? (I cannot use any hardware flow control as I don't need the serial data lines at all.)

like image 789
SecStone Avatar asked Jan 21 '12 09:01

SecStone


2 Answers

There is the ioctl TIOCMIWAIT which blocks until a given set of signals change.

Sadly this ioctl is not documented in the tty_ioctl(4) page nor in ioctl_list(4).

I have learned about this ioctl in this question:

Python monitor serial port (RS-232) handshake signals

like image 53
A.H. Avatar answered Sep 28 '22 06:09

A.H.


The select system call is meant for applications like that. You can do other work, or sleep, then periodically check the status of the FD_SET. It might even be overkill for what you are doing, if your program does nothing else but grab data.

like image 23
jim mcnamara Avatar answered Sep 28 '22 08:09

jim mcnamara