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 / 6544
6543  |  6545
Subject: 
Reading Serial Port
Newsgroups: 
lugnet.robotics.handyboard
Date: 
Thu, 29 Jul 1999 07:27:27 GMT
Original-From: 
David Boosalis <dboosalis@mail/spamcake/.arc.nasa.gov>
Viewed: 
450 times
  
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");




--
MIME ATTACHMENTS DISCARDED:

1.  Content-Type: text/x-vcard; charset=us-ascii;
     name="dboosalis.vcf"
    Content-Transfer-Encoding: 7bit
    Content-Description: Card for David Boosalis
    Content-Disposition: attachment;
     filename="dboosalis.vcf"
    Content-Length: 340



Message has 2 Replies:
  Re: Reading Serial Port
 
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 (...) (25 years ago, 29-Jul-99, to lugnet.robotics.handyboard)
  Re: Reading Serial Port
 
David Boosalis <dboosalis@mail.arc.nasa.gov> moved upon the face of the 'Net and spake thusly: (...) "Use The Source, Luke". Check the source code of the downloader in the Unix port of Interactive C. (...) I think you want 9600, not 921kbaud (unless (...) (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