URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6191
[ Назад ]

Исходное сообщение
"Чтение из Com порта под linux"

Отправлено nkly , 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 порт символы, в какой момент времени-я не знаю и эти символы читаются этой программкой. Меня в ней не устраивает то, что на экран символы выводятся только после того как  от устройства придет символ перевода строки.
Как сделать так чтобы программа сразу же выводила полученный символ, а не ждала когда придет символ перевода строки?
В перспективе мне нужно выводить не на экран а обрабатывать полученные данные в программе.
Если можно рабочий пример.


Содержание

Сообщения в этом обсуждении
"Чтение из Com порта под linux"
Отправлено perece , 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^/


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

\^P^/


"Чтение из Com порта под linux"
Отправлено nkly , 22-Фев-07 14:37 
>честно - лень мне. это же элементарно, Ватсон!

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


"Чтение из Com порта под linux"
Отправлено serge , 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