To LUGNET HomepageTo LUGNET News HomepageTo LUGNET Guide Homepage
 Help on Searching
 
Post new message to lugnet.robotics.handyboardOpen lugnet.robotics.handyboard in your NNTP NewsreaderTo LUGNET News Traffic PageSign In (Members)
 Robotics / Handy Board / 6546
6545  |  6547
Subject: 
Re: Reading Serial Port
Newsgroups: 
lugnet.robotics.handyboard
Date: 
Thu, 29 Jul 1999 12:21:28 GMT
Original-From: 
Andrea M Okerholm <amo@andrew.SPAMLESScmu.edu>
Viewed: 
400 times
  
It isn't hanging, it's a blocking read until it recieves some specified
number of characters. You can use a non blocking read by specifying
O_NONBLOCK, in which case read() will return immediately. The Linux serial
programming HOWTO is very good, I used to to make my own serial program
linux -> handyboard -> linux.

This is your problem:
   newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character
arrives */

Add O_NONBLOCK here:
  fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );

The HB can transmit at 9600 baud, you don't need to wait as long as a
second. Just make sure that the Linux box is expecting 9600 and there
shouldn't be a problem.
Your IC code should also wait for the UART to clear before sending each
character. The serial.c on the website does this. I've been using the
serialq code which works well also.

Change this to B9600:
#define BAUDRATE B921600

-Andrea

--On Thu, Jul 29, 1999 3:27 AM -0400 David Boosalis
<dboosalis@mail.arc.nasa.gov> wrote:

This is not really a HB question, but I am hoping someone here has
experience in it anyway.  My question is in how do you read the Serial
port under Linux.  The Linux HOWTO's give an example, which I show
below. What happens is that it hangs on the read, that is I never see
the second printf after the read in the code below.  Perhaps there is
someting wrong with my IC code, as the lights do not flash on the serial
board showing any network traffic.  I transmit "David\n", one character
every second.


Any suggestions most appreciated.
David Boosalis



#included by <termios.h> */
#define BAUDRATE B921600
#define MODEMDEVICE "/dev/ttyS0"
#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 */
     printf("doing read...\n");
     res = read(fd,buf,255);
     printf("done width read\n");







-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Music is well said to be the speech of angels; in fact, nothing among the
utterances allowed to man is felt to be so divine. It brings us near to the
infinite.
                                                    ~ Thomas Carlyle ~



Message is in Reply To:
  Reading Serial Port
 
This is not really a HB question, but I am hoping someone here has experience in it anyway. My question is in how do you read the Serial port under Linux. The Linux HOWTO's give an example, which I show below. What happens is that it hangs on the (...) (25 years ago, 29-Jul-99, to lugnet.robotics.handyboard)

3 Messages in This Thread:


Entire Thread on One Page:
Nested:  All | Brief | Compact | Dots
Linear:  All | Brief | Compact
    

Custom Search

©2005 LUGNET. All rights reserved. - hosted by steinbruch.info GbR