Hello, I need to use an UART to communicate between beaglebone and the device. I have written the C code, but it has a few problems within it. I can't identify the cause of the problem or to be more precise don't know how fix it.
The problem is of reading in the information and displaying it on a shell. I can easily write any information data set that I wish, but when I try to read in response it either doesn't read in, with the perror being displayed as (erno = EINTR [Interrupted function call]) meaning read () function returned negative number. #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> #include <errno.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; int main () { int fd=0, res=0; int check=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); check = tcgetattr(fd, &oldtio); if (check<0){perror("tcgetattr");} check = newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD ; if (check<0){ perror("c_cflag");} check = newtio.c_iflag = IGNPAR | IXON; if (check<0){perror("c_iflag");} check = newtio.c_oflag = 0; if (check<0){perror("c_oflag");} //check = newtio.c_lflag = ICANON | ISIG; check = newtio.c_lflag = 0; if (check<0){perror("c_lflag ");} /* c_cc is responsible for an erno error */ check = newtio.c_cc[VMIN]=1; if (check<0){perror("c_cc[VMIN]");} check = newtio.c_cc[VTIME]=0; if (check<0){perror("c_cc[VTIME]");} tcflush(fd, TCIFLUSH); check = tcsetattr(fd, TCSANOW, &newtio); if (check<0){perror("tcsetattr" );} for(;;) { ioctl(fd, TIOCSBRK); usleep(1300); ioctl(fd,TIOCCBRK); usleep(200); /* send request to actuator to receive the current setting and setup */ check = write(fd, SYNC, sizeof(SYNC)); if (check<0){perror("SYNC");} check = write(fd,PID, sizeof(PID)); if (check<0){perror("PID");} /* read response*/ res = read(fd, buff,255); if (res < 0) { perror("read"); //if(errno ==EINTR) continue; } printf(": :%d :%d\n", res,buff); usleep(10000); } close (fd); } void signal_handler_IO(int status) { wait_flag=FALSE; e} erno EINTR error is displayed only when i'm setting any non-zero values to c_cc[VTIME] or c_cc[VMIN]. but still even if i set the both to zero, I cannot read anything from the port, it's just blank. I'm confident that i'm receiving response from the device, I have checked it with oscilloscope. Any assistance would be appreciated. if possible with the code examples for me to see what should I modify. Thank you very much for the help. -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.