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.

Reply via email to