nixp.ru v3.0

22 января 2017,
воскресенье,
21:12:53 MSK

Аутсорсинг Linux с компанией «Флант»
mishail написал 9 июня 2005 года в 16:24 (779 просмотров) Ведет себя неопределенно; открыл 1 тему в форуме, оставил 1 комментарий на сайте.

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

А подскажите, пожалуйста, кто знает, как в С можно реализовать неблокирующее чтение из файлового дескриптора (конкретно из /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 сразу проверит, что ничего нет и всё…

как быть?

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

metal

Вообще установка флага O_NONBLOCK должно помочь. Можно также установить таймер и когда придет сигнал от таймера системный вызов должен прерваться.

rgo

можно ещё посмотреть в сторону фции select.

mishail

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

Я пошёл другим путём. Флаг O_NONBLOCK не помогает — проверено :). Надо, оказывается, было просто при инициализации параметров ком-порта указать значения c_cc[VMIN] и c_cc[VTIME].

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.