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 / 6545
6544  |  6546
Subject: 
R: Reading Serial Port
Newsgroups: 
lugnet.robotics.handyboard
Date: 
Thu, 29 Jul 1999 07:59:41 GMT
Original-From: 
Stefano Falconetti <falconetti@sigma.it/stopspammers/>
Viewed: 
1246 times
  
You can try Java comm API, under linux too.
(If you want to use java ... :-)
Stefano

----------
| Da: David Boosalis <dboosalis@mail.arc.nasa.gov>
| A: handyboard mailist <handyboard@media.mit.edu>
| Oggetto: Reading Serial Port
| Data: 29 July 1999 09:27
|
| 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");
|
|
|
|



Message has 1 Reply:
  Re: R: Reading Serial Port
 
also remember that at 9600 baud or higher, you may not see the flashing of the serial LEDs. try setting the baud rate to 300 or even 110 if you're doing visual-flash debugging. fred In your message you said: (...) (25 years ago, 29-Jul-99, to lugnet.robotics.handyboard)

2 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