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.

Reply via email to