LINUX.ORG.RU

неблокирующий ввод/вывод в С


0

0

Доброе время суток, коллеги.

А подскажите, пожалуйста, кто знает, как в С можно реализовать неблокирующее чтение из файлового дескриптора (конкретно из /dev/ttyS[n])?

Короче, есть у меня девайс, подключающийся к COM-порту. Пишу программу, надо реализовать функцию, которая проверяет, подключён ли девайс. Я думаю себе это сделать так:
1. подать команду ТЕСТ в девайс (он должен вернуть определённое число)
2. прочитать с таймаутом... если ничего нет - значит не подключён

программка примерно выглядит так:
//открываем порт
int fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
//устанавливаем параметры порта
.....
// даём команду "ТЕСТ"
char cmd[1];
cmd[0] = TST_CONNECTION;
write (fd, cmd, 1);
//читаем
cmd[0] = 0;
read(fd, cmd, 1);
if (cmd[0] == 0) return ERROR;

функция read блокирующая - т.е. будет ждать, пока что-нибудь не придёт (даже несмотря на флаги O_NDELAY и O_NONBLOCK почему-то :-\ )... есть, конечно функции из группы unlocked_stdio (getc_unlocked, например)... но они работают с файловыми потоками, а не с дескрипторами файлов.... а мне для установки параметров COM-порта и вообще для работы с ним нужен именно дескриптор.... да и девайсу нужно какое-то время, чтобы ответ послать, а getc_unlocked сразу проверит, что ничего нет и всё...

как быть?

заранее спасибо за ответы.

Ответ на: комментарий от anonymous

>unsigned int fl;

>fl=fcntl(fd,F_GETFL);

>fcntl(fd,F_SETFL,fl|O_NONBLOCK);

ето расчитано на сокеты.

есть ли какаято гарантия что ето будет работать на ком-портах????

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

>>unsigned int fl;

>>fl=fcntl(fd,F_GETFL);

>>fcntl(fd,F_SETFL,fl|O_NONBLOCK);

> ето расчитано на сокеты.

это расчитано на файлы/устройства, которые в начальной инстанции имеют файловый дескриптор и поддерживающие неблокирующий IO.

> есть ли какаято гарантия что ето будет работать на ком-портах????

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

> А что, попробовать тяжело? На стандартном терминале это работает? Должно и на COM-порту.

эээ .. не понял я .. чего и зачем мне надо пробывать?

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

>>>unsigned int fl;

>>>fl=fcntl(fd,F_GETFL);

>>>fcntl(fd,F_SETFL,fl|O_NONBLOCK);

>> ето расчитано на сокеты.

>это расчитано на файлы/устройства, которые в начальной инстанции имеют файловый дескриптор и поддерживающие неблокирующий IO.

>> есть ли какаято гарантия что ето будет работать на ком-портах????

неудачно выразил мысль. я всего - навсего хотел выразить свои сомнения в применимости етого вызова к терминалам и ком-портам в часности

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

хех. попробовать должен был я. ну и собсно попробовал.
всё правильно. этот метод не работает. действительно fcntl(...|O_NONBLOCK) с COM-портом не отрабатывает. зато если его не указывать при открытии дескриптора, то при инициализации параметров порта (tcsetattr) можно указать в массиве termios->c_cc[VTIME] и c_cc[VMIN] тады все чудненко получается :))))

так что совет про man tcsetattr оказался весьма удачным... всем спасибо.

Mishail
() автор топика
Ответ на: комментарий от Mishail

>то при инициализации параметров порта (tcsetattr) можно указать в массиве termios->c_cc[VTIME] и c_cc[VMIN] тады все чудненко получается :))))

это оно и есть

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