The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Чтение из Com порта под linux"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Чтение из Com порта под linux"  
Сообщение от nkly (ok) on 22-Фев-07, 12:15 
Есть такая программка, которая читает данные из com порта и выводит данные в std.
Вот ее код
#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <iostream>
#include <unistd.h>

int open_port(void);

int main(void)
{
    fd_set rfds;
    struct timeval tv;
    int retval, fd, k, p, bufsize;
    int buf_size = 10;
    char buf[buf_size];
        
    /* Следим ввели ли что-либо. */
    fd=open_port();
    FD_ZERO(&rfds);
    FD_SET(fd, &rfds);
    
    tv.tv_sec = 15;/* Сколько секунд ждем. */
    tv.tv_usec = 0;
    
    retval = select(fd+1, &rfds, NULL, NULL, &tv);
    /* На значение tv в данный момент полагаться нельзя! */

    if (retval)
        {
        printf("Данные доступны.\n");
    /* FD_ISSET(0, &rfds) will be true. */
            k= read(fd,buf,buf_size);
        if (k>0)
            {    std::cout<<"Полезные символы ";
                for (int j=0; j<k ;j++)
                    {
                    std::cout<<buf[j];
                    }
            }
        }
    else
        {printf("Нет данных в течение 15 секунд.\n");}
close(fd);
}

int  open_port(void)
    {
      int fd; /* файловый дескриптор для порта */
    fd=open("/dev/ttyS0",O_RDWR | O_NONBLOCK);
    if (fd == -1)
      {
       /*
    * Could not open the port.
    * Если порт не открывается.
    */

    perror("open_port: Unable to open /dev/ttyS0 - ");
      }
     else
    return (fd);

    }

У меня к com порту подсоединено устройство которое присылает в мой com порт символы, в какой момент времени-я не знаю и эти символы читаются этой программкой. Меня в ней не устраивает то, что на экран символы выводятся только после того как  от устройства придет символ перевода строки.
Как сделать так чтобы программа сразу же выводила полученный символ, а не ждала когда придет символ перевода строки?
В перспективе мне нужно выводить не на экран а обрабатывать полученные данные в программе.
Если можно рабочий пример.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Чтение из Com порта под linux"  
Сообщение от perece on 22-Фев-07, 12:33 
>   { std::cout<<"Полезные символы ";
>    for (int j=0; j<k ;j++)
>     {
>     std::cout<<buf[j];
>     }
>   }
>  }
> else
>        {printf("Нет данных в течение
[...]
> Как сделать так чтобы программа сразу же выводила полученный символ, а
>не ждала когда придет символ перевода строки?
>В перспективе мне нужно выводить не на экран а обрабатывать полученные данные
>в программе.
выводить правильно. не очень понятно, почему в одном случае std::cout<<, а в другом printf. но не годится ни то, ни другое. только write(1,&buf[j],1);
(или fflush(stdout) после каждого printf/putchar/... , но это крайне неэффективно. как fflush c std::cout<< соотносится ваще не знаю, мож и не будет работать. можно еще попробовать setbuf(stdout,NULL); - для упрощения себе жизни, и использовать putchar. но и это ИМХО криво)
>Если можно рабочий пример.
честно - лень мне. это же элементарно, Ватсон!

\^P^/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Чтение из Com порта под linux"  
Сообщение от perece on 22-Фев-07, 12:39 
забыл напомнить: смешивать write(1, ...) и всякие printf, putchar, etc. надо крайне осторожно, вставляя fflush(stdout) во все места, где write используется _после_ stdioшных функций. иначе можно получить весьма непредсказуемый вывод...

\^P^/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Чтение из Com порта под linux"  
Сообщение от nkly (??) on 22-Фев-07, 14:37 
>честно - лень мне. это же элементарно, Ватсон!

Холмсу может быть и элементарно, но он всегда объяснял Ватсону как достиг результата.
Если нетрудно напишите пример.
Сам я месяц буду разбираться.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Чтение из Com порта под linux"  
Сообщение от serge email(??) on 02-Мрт-09, 13:11 
>>честно - лень мне. это же элементарно, Ватсон!
>
>Холмсу может быть и элементарно, но он всегда объяснял Ватсону как достиг
>результата.
>Если нетрудно напишите пример.
>Сам я месяц буду разбираться.

Нужно установить неканонический ввод.
Цитата "Неканонический ввод не обрабатывается. Вводимый символ передается без изменений, так как он был принят. В основном вы сбрасываете опции ICANON, ECHO, ECHOE и ISIG приустановке неканонического ввода:
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);"
Подробнее - http://cisco.opennet.ru/docs/RUS/serial_guide/index.html#2_5_2

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру