This is a snippet of code from my JNI C libary which works: [code] JNIEXPORT jint JNICALL Java_cantley_co_uk_clsMain_openDevice (JNIEnv *pEnv, jclass obj, jstring strDevice, jboolean blnRx, jboolean blnDebug) { const char *pstrDevice = (*pEnv)->GetStringUTFChars(pEnv, strDevice, NULL); // Try to open the port int intFD = open(pstrDevice, O_RDWR | O_NOCTTY | O_NDELAY); if ( intFD >= 0 ) { struct termios options; // Get the current options for the port... tcgetattr(intFD, &options); // Set the baud rates to 115200... cfsetispeed(&options, B115200); cfsetospeed(&options, B115200); // options.c_cflag |= (CLOCAL | CREAD); options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); options.c_oflag &= ~OPOST; options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); options.c_cflag &= ~(CSIZE | PARENB); options.c_cflag |= CS8;
if ( blnRx == JNI_TRUE ) { options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 2; } else { // non-blocking, we aren't reading options.c_cc[VMIN] = options.c_cc[VTIME] = 0; } tcsetattr(intFD, TCSANOW, &options); if ( blnRx == JNI_TRUE ) { tcflush(intFD, TCIFLUSH); } fcntl(intFD, F_SETFL, FNDELAY); if ( blnDebug == JNI_TRUE ) { printf("%s opened and ready for use%s", pstrDevice, pstrEOL); } } else if ( blnDebug == JNI_TRUE ) { printf("%s, port not ready%s", pstrDevice, pstrEOL); } (*pEnv)->ReleaseStringUTFChars(pEnv, strDevice, pstrDevice); return intFD; } [/code] On Tuesday, 6 May 2014 19:42:34 UTC+1, Andrey wrote: > > 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.