AnsweredAssumed Answered

BF537 UART1 read fail

Question asked by raphaeljose on Jan 26, 2013
Latest reply on Jan 28, 2013 by Aaronwu

Hello, I need help with what I am working on. Currently I am trying to read the serial data from a load cell controller that I have. Unfortunately I am not able to receive anything when I run my module. So far I have configured my kernel to include UART0 and UART1, I can see both /dev/ttyBF0 and /dev/ttyBF1 at my user space, and I have connected my device to UART1 of the board, BF537. SW5 is configured as such: 1 = off, 2 = off, 3 = on, 4 = on. I also tested my device on an oscilloscope where I can see bits and those bits change when applying load to the load cell which I think is a good sign of a signal. After taking these settings into action, I ran a test program to see if I can return a reading from the board, however I do not get anything. the code that I used is written as:

 

#include <sys/types.h>

        #include <sys/stat.h>

        #include <fcntl.h>

        #include <termios.h>

        #include <stdio.h>

 

        /* baudrate settings are defined in <asm/termbits.h>, which is

        included by <termios.h> */

        #define BAUDRATE B38400           

        /* change this definition for the correct port */

        #define MODEMDEVICE "/dev/ttyS1"

        #define _POSIX_SOURCE 1 /* POSIX compliant source */

 

        #define FALSE 0

        #define TRUE 1

 

        volatile int STOP=FALSE;

 

        main()

        {

          int fd,c, res;

          struct termios oldtio,newtio;

          char buf[255];

        /*

          Open modem device for reading and writing and not as controlling tty

          because we don't want to get killed if linenoise sends CTRL-C.

        */

         fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );

         if (fd <0) {perror(MODEMDEVICE); exit(-1); }

       

         tcgetattr(fd,&oldtio); /* save current serial port settings */

         bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */

       

        /*

          BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.

          CRTSCTS : output hardware flow control (only used if the cable has

                    all necessary lines. See sect. 7 of Serial-HOWTO)

          CS8     : 8n1 (8bit,no parity,1 stopbit)

          CLOCAL  : local connection, no modem contol

          CREAD   : enable receiving characters

        */

         newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

        

        /*

          IGNPAR  : ignore bytes with parity errors

          ICRNL   : map CR to NL (otherwise a CR input on the other computer

                    will not terminate input)

          otherwise make device raw (no other input processing)

        */

         newtio.c_iflag = IGNPAR | ICRNL;

        

        /*

         Raw output.

        */

         newtio.c_oflag = 0;

        

        /*

          ICANON  : enable canonical input

          disable all echo functionality, and don't send signals to calling program

        */

         newtio.c_lflag = ICANON;

        

        /*

          initialize all control characters

          default values can be found in /usr/include/termios.h, and are given

          in the comments, but we don't need them here

        */

         newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */

         newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */

         newtio.c_cc[VERASE]   = 0;     /* del */

         newtio.c_cc[VKILL]    = 0;     /* @ */

         newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */

         newtio.c_cc[VTIME]    = 0;     /* inter-character timer unused */

         newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */

         newtio.c_cc[VSWTC]    = 0;     /* '\0' */

         newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */

         newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */

         newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */

         newtio.c_cc[VEOL]     = 0;     /* '\0' */

         newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */

         newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */

         newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */

         newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */

         newtio.c_cc[VEOL2]    = 0;     /* '\0' */

       

        /*

          now clean the modem line and activate the settings for the port

        */

         tcflush(fd, TCIFLUSH);

         tcsetattr(fd,TCSANOW,&newtio);

       

        /*

          terminal settings done, now handle input

          In this example, inputting a 'z' at the beginning of a line will

          exit the program.

        */

         while (STOP==FALSE) {     /* loop until we have a terminating condition */

         /* read blocks program execution until a line terminating character is

            input, even if more than 255 chars are input. If the number

            of characters read is smaller than the number of chars available,

            subsequent reads will return the remaining chars. res will be set

            to the actual number of characters actually read */

            res = read(fd,buf,255);

            buf[res]=0;             /* set end of string, so we can printf */

            printf(":%s:%d\n", buf, res);

            if (buf[0]=='z') STOP=TRUE;

         }

         /* restore the old port settings */

         tcsetattr(fd,TCSANOW,&oldtio);

        }

 

 

 

taken from: http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html#AEN125

 

it only returns as an error, specifically an EAGAIN error. I do believe that I am not getting any data to the board considering I have acquired a signal by testing it on the scope. I hope to hear anyone who can help, I have come to a dead end and I have no idea what else could be the problem.

Outcomes