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.

Reply via email to