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
|
| |
![Post a public reply to this message](/news/icon-reply.gif) | |
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: ![](/news/x.gif) | | 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)
| ![](/news/x.gif) | | 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: ![You are here](/news/here.gif) ![](/news/246.gif) ![Re: Reading Serial Port -handyboard@media.mit.edu (Andrea M Okerholm) (29-Jul-99 to lugnet.robotics.handyboard)](/news/x.gif)
![](/news/x.gif) ![](/news/68.gif) ![Re: Reading Serial Port -handyboard@media.mit.edu (Christopher Biggs) (29-Jul-99 to lugnet.robotics.handyboard)](/news/x.gif)
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|