Название: Чтение из 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 при инициализации параметров порта в следующее значение
Код:
это означает,что функция чтения из порта (например fget) будет немедленно возвращать один пришедший символ как только он прилетел в ком порт. Название: Чтение из Com порта под linux Отправлено: garryk от Июль 10, 2007, 22:45 Цитата: "nkly777" Код:
Вообще-то этим вы задали таймаут для чтения очередного байта, а считать прога будет столько сколько пришлете. Вот еслиб вы задали newtio.c_cc[VMIN] = 1; тогда прога работала б так как вы сказали. |