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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение из Com порта под linux  (Прочитано 13015 раз)
nkly777
Гость
« : Февраль 15, 2007, 16:23 »

Для чтения данных из com порта использую функцию read(). В Serial Programming Guide for POSIX Operating Systems написано что работает она следующим образом:
"Когда вы работаете с портом в режиме не структурированного посимвольного обмена (raw data mode), каждый системный вызов read() будет каждый раз возвращать число символов реально прочитанных в буфер ввода. Если в текущий момент нет символов доступных для чтения, то вызов будет блокироваться (wait) до тех пор пока не появятся символы для чтения, или закончится счетчик таймаута, или обнаружится какая-нибудь ошибка. Функцию read можно выполнить так, что она вернет управление немедленно. Для этого она должна быть оформлена следующим образом:
Цитировать
fcntl(fd, F_SETFL, FNDELAY);

Опция FNDELAY указывает функции read возвращать 0 если нет символов доступных для чтения из последовательного порта. Для восстановления нормально поведения (с блокировками), необходимо вызвать fcntl() без опции FNDELAY:
Цитировать
fcntl(fd, F_SETFL, 0);

Это также выполняется после открытия последовательного порта с опцией O_NDELAY. "

Я написал следующий код:
Цитировать
#include <fcntl.h>   /* File control definitions */
    #include <iostream>
   
int open_port(void);      //Функция открытия порта
int kolvo_bait_from_port=5;   //Количество байт считываемых с порта функцией read.
   
int main()
{
char buf[kolvo_bait_from_port];
int k;
int fd=open_port();
while(1)
{
k=read(fd,buf,kolvo_bait_from_port);
std::cout<<"Read return "<<k<<std::endl;
}
close(fd);
}

  int  open_port(void)
    {
      int fd;
   fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK);
   if (fd == -1)
      {
      std::cout<<"open_port: Unable to open /dev/ttyS0 - "<<std::endl;
      }
   else
      fcntl(fd, F_SETFL, 0);
   return (fd);
    }

Если в com порту есть что читать то все нормально,а если нет то функция read()  ждет когда появятся символы для чтения.
Как правильно настроить функцию read  под linuxом чтобы она сразу возвращала 0 при отсутствии символов?
Если можно рабочий пример.
Записан
nkly777
Гость
« Ответ #1 : Февраль 19, 2007, 10:01 »

Ну раз никто не отвечает значит придется отвечать самому. Сам разобрался, если кому интересно то читайте.
Оказывается флаг O_NONBLOCK для функции open работает. Если после того как мы открываем порт с флагом O_NONBLOCK вызвать функцию read и при этом на входе у нас нет символов, то read не переходит в режим ожидания символов, а завершает работу с кодом не ноль, как написано в документации, а с кодом -1, как при ошибке. Далее организуем бесконечный цикл условием прерывания которого будет возвращение функцией read значения отличного от -1 и все получится.
Нашел еще почти готовый пример с использованием функции select
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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