Последовательное программирование (аппаратное рукопожатие)

Я пытаюсь запрограммировать последовательную связь, используя аппаратное рукопожатие в Linux, используя C/C++. Сигналами, реализующими рукопожатие, являются CTS (разрешение на отправку) и RTS (запрос на отправку). В настоящее время моя функция для установки сигнала CTS выглядит следующим образом:

int setCTS(int fd, int value) {
    int status;
    ioctl(fd, TIOCMGET, &status); // get the current port status
    if (value)
        status |= TIOCM_CTS; // rise the CTS bit
    else
        status &= ~TIOCM_CTS; // drop the CTS bit
    ioctl(fd, TIOCMSET, $status); // set the modified status
    return 0;
}

где fd — файловый дескриптор порта, а value — значение, которое нужно установить для сигнала. Чтобы закодировать эту функцию, я использовал http://www.easysw.com/~mike/serial/serial.html#5_1.

Проблема в том, что gcc не распознает ни одну из констант, использованных в примере. Какие-либо предложения?

-- Обновлять --

Я нашел ответ. Глядя на другой пример, sys/ioctl.h объявляет константы.


person freitass    schedule 14.08.2009    source источник
comment
Я считаю, что grep полезен для ответов на подобные вопросы — просто найдите все файлы по пути включения.   -  person Mark Ransom    schedule 14.08.2009


Ответы (1)


Это может быть неприменимо для вашего конкретного приложения, но я решил опубликовать его здесь на случай, если это поможет вам или кому-то еще в поиске.

В большинстве систем с termios вы можете установить флаг CRTSCTS в члене ->c_cflags структуры termios, которую вы передаете tcsetattr, и ядро ​​или аппаратное обеспечение будут выполнять за вас управление потоком RTS/CTS.

(Это не POSIX, но он есть как в BSD, так и в системах, производных от SystemV, поэтому он почти везде, включая Linux).

person caf    schedule 15.08.2009
comment
Я поддерживаю это. Вы действительно очень хотите, чтобы линейная дисциплина управляла дросселированием CTS/RTS вверх и вниз для вашего приложения. - person codeDr; 27.08.2009