Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > тайм-ауты COM-порта


Автор: Waldis 8.4.2005, 19:57
Кто знает, подскажите, можно ли в линухах программно менять тайм-ауты COM-порта?

Автор: bilbobagginz 9.4.2005, 20:42
ответ: конечно же да, блин... вопросик странноватый...
как бы тогда без этого можно было бы напр. модем под линуксом использовать ?

как это сделать: нужно выкурить man termios
и после юзать: int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);

удачи.


Автор: GrayCardinal 10.4.2005, 11:41
Waldis
не конкретный вопрос, имхо. Это в винде только таймауты com-порта, а у нас (в линукс) таймауты на выполнение запроса smile
а вариантов таймаутов - дофига. самый простой через alarm ()

ЗЫ
может я не понял вопроса ?

Автор: Oligarch 11.4.2009, 11:13
Цитата(Waldis @ 8.4.2005,  19:57)
Кто знает, подскажите, можно ли в линухах программно менять тайм-ауты COM-порта?

Используй массив с_сс структуры struct termios:

struct termios options;
options.c_cc[VMIN]
options.c_cc[VTIME]

Драйвера последовательного интерфейса UNIX предоставляют возможность специфицировать таймауты для символа и пакета. Два элемента массива c_cc используемых для указания таймаутов: VMIN и VTIME. Таймауты игнорируются в случае режима канонического ввода или когда для файла устройства установлена опция NDELAY при открытии файла open или с использованием fcntl. 

VMIN определяет минимальное число символов для чтения. Если VMIN установлено в 0, то значение VTIME определяет время ожидания для каждого читаемого символа. Примечательно, что это не подразумевает, что вызов read для N байтов будет ждать поступление N символов. Тайаут произойдет в случае задержки приема любого одиночного символа и вызов read вернет число непосредственно доступных символов (вплоть до числа которое вы запросили). 

Если VMIN не 0, то VTIME определяет время ожидания для чтения первого символа. Если первый символ прочитан в течение указанного времени, то любое чтение будет блокироваться (ждать) пока все число символов, указанное в VMIN, не будет прочитано. Таким образом, как только первый символ будет прочитан, драйвер последовательного интерфейса будет ожидать приема всего пакета символов (всего количества байтов указанного в VMIN). Если символ не будет прочитан за указанное время, то вызов read вернет 0. Этот метод позволяет вам указать последовательному интерфейсу возвращать 0 или N байтов. Однако, таймаут будет приниматься только для первого читаемого символа, таким образом, если драйвер по какой-либо причине 'потеряет' один символ из N-байтного пакета, то вызов readможет быть заблокирован ожиданием ввода дополнительного символа навсегда. 

VTIME определяет величину времени ожидания ввода символа в десятых долях секунды. Если VTIME установлено в 0 (по умолчанию), то чтение будет заблокировано в ожидании на неопределенное время если для порта не была установлена опция NDELAY вызовом open или fcntl. 

Автор: Helmet 11.4.2009, 11:29
Oligarch, ты зачем это все написал?  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)