Russian Qt Forum

Программирование => С/C++ => Тема начата: nkly777 от Февраль 27, 2007, 09:32



Название: Чтение из Com порта под linux
Отправлено: nkly777 от Февраль 27, 2007, 09:32
Пишу программу на C++  под Linux
Мне в программе нужно читать информацию с удаленного текстового терминала. Эта информация приходит ко мне в com-порт. И когда от терминала приходит символ перевода строки моя программа выводит полученную информацию на экран (в stdout). На экран я вывожу в качестве отладки. Но мне необходимо чтобы программа не дожидалась когда придет символ перевода строки, а как только в com порт прилетел какой-либо символ он сразу же должен быть выведен на экран, точнее добавлен в созданный мной в программе массив.
То есть мне нужно реализовать небуферизованный ввод-вывод. Мучаюсь уже долго, никак не могу реализовать, пробовал разные варианты но ничего не получается.
В интернете ничего толком не нашел. Вроде бы при открытии /dev/ttyS0 функцией open указываю ключ O_NONBLOCK но не помогает. Есть еще ключ O_NOCTTY но для чего он мне непонятно,( кто-нибудь может разъяснить?)
А может нужно использовать функцию fopen()? Но как тогда задать O_NONBLOCK?
Что делают функции fcntl(), ioctl(), fflush(), select(), и нужны ли они в моем случае?
Для чтения из порта нужно использовать read() или getc, getchar или другие?
Кто-нибудь может написать рабочий пример?


Название: Чтение из Com порта под linux
Отправлено: nkly777 от Июнь 13, 2007, 09:44
По прошествии времени отвечу сам себе. (Может и другим пригодится) Чтобы символ пришедший в ком порт сразу же был прочитан программой нужно установить элементы массива c_cc в структуре termios при инициализации параметров порта в следующее значение
Код:

newtio.c_cc[VTIME]    = 1;
newtio.c_cc[VMIN]     = 0;

это означает,что функция чтения из порта (например fget) будет немедленно возвращать один пришедший символ как только он прилетел в ком порт.


Название: Чтение из Com порта под linux
Отправлено: garryk от Июль 10, 2007, 22:45
Цитата: "nkly777"

Код:

newtio.c_cc[VTIME]    = 1;
newtio.c_cc[VMIN]     = 0;



Вообще-то этим вы задали таймаут для чтения очередного байта, а считать прога будет столько сколько пришлете.
Вот еслиб вы задали newtio.c_cc[VMIN]     = 1; тогда прога работала б так как вы сказали.