I need uart driver for insmod kernel,can you help me! 2014-05-17 17:53 GMT+07:00, Simon Platten <[email protected]>: > 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 a topic in the > Google Groups "BeagleBoard" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/beagleboard/vbRrGiqZyfs/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > For more options, visit https://groups.google.com/d/optout. >
-- 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 [email protected]. For more options, visit https://groups.google.com/d/optout.
