LINUX.ORG.RU

rs232 прерывание


0

0

к персоналке на rs232, на ножку cts(непомню точно, на суть) заведен генератор частоты.
в офтопике прогой для мотироринга COM порта проверено, индикатор состояния этой ножки мигает как нада.
насколько я знаю можно включить генерацию прерывания при изменении состояния на этой (и других ногах)
вопрос:
как максимально быстро и правильно узнать что произошло прерывание на на rs232 порте, и послать сигнал юзерской проге (или както по другому её проинформировать).

anonymous

man tty_ioctl

ИМХО, как-то так: int status; r=ioctl(fd, TIOCMGET, &status); CTS=status & TIOCM_CTS; недостаток: методика опроса, грузит процессор

Если включить аппаратный контроль RTSCTS, то возможность записи в порт означает установленный CTS. И можно в принципе ожидать в select()

Dr_ZLO
()

Когда-то сам в этом деле разбирался (по-моему не нашёл ничего лучше чем
ковырять ядрёные исходники и исходники pppd). Вот что в итоге нашёл:

(сначала надо открыть устройство системным вызовом open, предполагается
что дескриптор находится в переменной fd)

Ожидание изменения состояния какого-то вывода порта (по прерыванию,
без периодических опросов. Вызов блокируется пока состояние вывода
не изменится):
ioctl(fd, TIOCMIWAIT, TIOCM_CTS);       
                        //Второй аргумент может быть:
                        TIOCM_RNG
                        TIOCM_DSR
                        TIOCM_CD
                        TIOCM_CTS или их комбинация

Вот так можно получить количество изменений состояний каждого вывода
(нужно если, например, предыдущим вызовом мы ожидали изменения 
состояния одного из нескольких, и хотим узнать теперь какой именно
вызвал прерывание - для этого сравниваем количество изменений до и 
после):

#include <linux/serial.h>
struct serial_icounter_struct count;
ioctl(fd,TIOCGICOUNT,&count);

А вот так можно установить состояние какого-нибудь из выводов порта,
работающих на выход:

arg = TIOCM_DTR;
ioctl(fd, (state ? TIOCMBIS : TIOCMBIC), &arg); 

Этот вызов в зависимости от state ставит/снимает биты из arg

А вот так можно узнать состояние входных выводов порта:

ioctl(fd, TIOCMGET, &arg);

Этот вызов считывает состояние в arg; биты:
  TIOCM_RTS TIOCM_CTS TIOCM_DSR TIOCM_CAR TIOCM_DTR TIOCM_RNG

slav ★★
()
Ответ на: комментарий от slav

ЗЫ не уверен что приведённый метод не является linux-специфичным (даже скорее всего является, учитывая использование linux/serial.h). Но зато тут никакого поллинга не надо.

slav ★★
()

ко всему вышеперечисленному нужно добавить всегдашний совет - поставить в программе планировщик реального времени (man sched_setscheduler).

tailgunner ★★★★★
()

спасибо всем, особенно slav
похоже то что надо, после выходных проверю

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.