Russian Qt Forum
Ноябрь 22, 2024, 23:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение из Com порта под linux  (Прочитано 11315 раз)
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 или другие?
Кто-нибудь может написать рабочий пример?
Записан
nkly777
Гость
« Ответ #1 : Июнь 13, 2007, 09:44 »

По прошествии времени отвечу сам себе. (Может и другим пригодится) Чтобы символ пришедший в ком порт сразу же был прочитан программой нужно установить элементы массива c_cc в структуре termios при инициализации параметров порта в следующее значение
Код:

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

это означает,что функция чтения из порта (например fget) будет немедленно возвращать один пришедший символ как только он прилетел в ком порт.
Записан
garryk
Гость
« Ответ #2 : Июль 10, 2007, 22:45 »

Цитата: "nkly777"

Код:

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



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


Страница сгенерирована за 0.101 секунд. Запросов: 20.