Есть такая программка, которая читает данные из 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 порт символы, в какой момент времени-я не знаю и эти символы читаются этой программкой. Меня в ней не устраивает то, что на экран символы выводятся только после того как от устройства придет символ перевода строки.
Как сделать так чтобы программа сразу же выводила полученный символ, а не ждала когда придет символ перевода строки?
В перспективе мне нужно выводить не на экран а обрабатывать полученные данные в программе.
Если можно рабочий пример.
> { 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^/
забыл напомнить: смешивать write(1, ...) и всякие printf, putchar, etc. надо крайне осторожно, вставляя fflush(stdout) во все места, где write используется _после_ stdioшных функций. иначе можно получить весьма непредсказуемый вывод...\^P^/
>честно - лень мне. это же элементарно, Ватсон!Холмсу может быть и элементарно, но он всегда объяснял Ватсону как достиг результата.
Если нетрудно напишите пример.
Сам я месяц буду разбираться.
>>честно - лень мне. это же элементарно, Ватсон!
>
>Холмсу может быть и элементарно, но он всегда объяснял Ватсону как достиг
>результата.
>Если нетрудно напишите пример.
>Сам я месяц буду разбираться.Нужно установить неканонический ввод.
Цитата "Неканонический ввод не обрабатывается. Вводимый символ передается без изменений, так как он был принят. В основном вы сбрасываете опции ICANON, ECHO, ECHOE и ISIG приустановке неканонического ввода:
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);"
Подробнее - http://cisco.opennet.ru/docs/RUS/serial_guide/index.html#2_5_2