Доброе время суток, коллеги.
А подскажите, пожалуйста, кто знает, как в С можно реализовать неблокирующее чтение из файлового дескриптора (конкретно из /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 сразу проверит, что ничего нет и всё…
как быть?
заранее спасибо за ответы.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Вообще установка флага O_NONBLOCK должно помочь. Можно также установить таймер и когда придет сигнал от таймера системный вызов должен прерваться.
можно ещё посмотреть в сторону фции select.
Спасибо за ответы.
Я пошёл другим путём. Флаг O_NONBLOCK не помогает — проверено :). Надо, оказывается, было просто при инициализации параметров ком-порта указать значения c_cc[VMIN] и c_cc[VTIME].