Как эффективно ждать CTS или DSR RS232 в Linux? - PullRequest
5 голосов
/ 21 января 2012

В настоящее время я читаю сигналы 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;
        }
    }
}

Есть ли лучшее решение, использующее C или C ++ в Linux? (Я не могу использовать аппаратное управление потоком данных, поскольку мне вообще не нужны строки последовательных данных.)

Ответы [ 2 ]

8 голосов
/ 21 января 2012

Существует ioctl TIOCMIWAIT, который блокирует, пока данный набор сигналов не изменится.

К сожалению, этот ioctl не задокументирован ни на странице tty_ioctl(4), ни в ioctl_list(4).

Я узнал об этом ioctl в этом вопросе:

Сигналы квитирования последовательного порта монитора Python (RS-232)

1 голос
/ 21 января 2012

Системный вызов select предназначен для подобных приложений. Вы можете выполнять другую работу или спать, а затем периодически проверять состояние FD_SET. Это может быть даже излишним для того, что вы делаете, если ваша программа не делает ничего, кроме захвата данных.

...