The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"read() из ком-порта и таймауты"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"read() из ком-порта и таймауты"
Сообщение от Ivan daniluk emailИскать по авторуВ закладки on 15-Июл-04, 13:19  (MSK)
Есть устройство, разговаривающее с компом через rs232. Ставлю на дескриптор таймаут на чтение:

fd = open(path, O_RDWR | O_NOCTTY);
if (fd == -1)
{
    perror("open serial port");
    return fd;
}

/* Set up serial port */
fcntl(fd, F_SETFL, 0);
tcgetattr(fd, &options);
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
options.c_cflag |= (CLOCAL | CREAD);
/* set 8N1 */
options.c_cflag |= CS8;
/* set timeouts */
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 4;
tcsetattr(fd, TCSANOW, &options);


По документации, с такими опциями(c_cc[VMIN] == 0 && c_cc[VTIME] > 0), функция read() будет выходить по таймауту - либо раньше, если что-либо в буффер попадет. Так вот, на одном из циклов чтения(читает по 1 байту BTW), read() замерзает. Просто ожидает вечно чего-то на вход и не выходит по таймауту. Прошелся с ddd, параметры порта нигде не изменяются, таймаут вроде устанавливается правильно. Делал уже и таймаут через select - та же херня - select() возвращает 1, а read() замерзает. По идее ведь с установленным таймаутом, read() не должен "замерзать" никогда?! Или есть еще ситуации?
Я теряюсь, не знаю, куда дальше копать. Ядро 2.6.7.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "read() из ком-порта и таймауты"
Сообщение от Ivan Daniluk emailИскать по авторуВ закладки on 15-Июл-04, 20:18  (MSK)
Проблема была в том, что по умолчанию для ком-порта устанавливался канонический режим чтения, а от девайса передавались управляющие символы вроде 0x04, 0x05, которые в данном контексте не должны были быть управляющими.
Проблемы решилась установкой следующих флагов:
.c_lflag |= IEXTEN;
.c_lflag &= ~ICANON;

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру