Alexander_a писал(а): ↑26.02.2006 02:25
Я пробую разобраться в коде программы statserial.
Для проверки состояния пинов интерфейса RS232, используют ioctl() функцию:
Код: Выделить всё
.......
fd = open(device, O_RDONLY);
......
status = ioctl(fd, TIOCMGET, &arg);
printf ("Печатаем состояние на пине RTS: %d\n", !!(arg & TIOCM_RTS));
......
Я никак не могу разобраться почему чтобы увидеть правильное значение, нужно помещать в скобки
(arg & TIOCM_RTS), а перед скобками два восклицаетльных знака?
Что здесь означают & и !! - поразрядная конъюнкция и двойное отрицание?
Помогите, как разобраться в этом?
& - поразрядная конъюнкция
!! - двойное отрицание
Подозреваю, что "правильное значение" это 0 или 1. Так ?
Если так, то все просто.
Выражение (arg & TIOCM_RTS) выдает 0 или 4 (TIOCM_RTS=4, см файл /usr/include/asm/termios.h).
С помощью !! его приводят к виду "0" или "1".
В случае, когда (arg & TIOCM_RTS) равно 0 - !(arg & TIOCM_RTS) равно 1.
В случае, когда (arg & TIOCM_RTS) равно 4 - !(arg & TIOCM_RTS) равно 0.
То есть это выражение приводит арифметику (0, 4) к логике (1, 0).
Второй "!" - инвертирует логическое значение и тем самым приводит (1,0) к (0,1)
В случае, когда (arg & TIOCM_RTS) равно 0 - !!(arg & TIOCM_RTS) равно 0.
В случае, когда (arg & TIOCM_RTS) равно 4 - !!(arg & TIOCM_RTS) равно 1.
както немного путано получилось.
В общем суть этого выражения - когда в разраде TIOCM_RTS стоит 0 - вывести 0, когда там 1 - вывести 1.