c++ - seriales - recibir datos serial arduino
Puerto serie(UART) c++ leer (0)
Tengo un pequeño problema con la función de lectura en c ++. Intento leer los datos disponibles en el puerto RxD de UART.
cuando ejecuto este código recibo el resultado (leer <0), por lo tanto, me muestra un mensaje de error error en lectura. qué se debe hacer para poder leer y visualizar los datos de la lectura. Estoy seguro de que hay datos disponibles en el puerto RxD. Lo he comprobado con un osciloscopio.
#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#define BAUDRATE B19200
#define PORT "/dev/ttyO4"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO(int status);
int wait_flag = TRUE;
main ()
{
int fd=0, res=0, result=0;
char SYNC [] = {0x55};
char PID [] = {0x6A};
struct termios oldtio, newtio;
struct sigaction saio;
char buff[255];
fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd<0) {perror(PORT); exit(-1);}
saio.sa_handler=signal_handler_IO;
saio.sa_flags=0;
saio.sa_restorer = NULL;
sigaction(SIGIO, &saio,NULL);
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd, &oldtio);
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
//newtio.c_lflag = 0;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
ioctl(fd, TIOCSBRK);
usleep(1300);
ioctl(fd,TIOCCBRK);
usleep(200);
write(fd, SYNC, sizeof(SYNC));
write(fd,PID, sizeof(PID));
res = read(fd, buff,255);
if (res < 0)
{
printf("read error/n");
}
else if (res ==0)
{
printf("read = 0 /n");
}
else
{
sprintf(result, "%x",res);
buff[res]=0;
printf(": %s :%d :%d/n", buff,result,res);
}
close (fd);
}
void signal_handler_IO(int status)
{
printf("received the signal/n");
wait_flag=FALSE;
}