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
|
| |
![Post a public reply to this message](/news/icon-reply.gif) | |
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:
![](/news/x.gif) | | 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: ![Reading Serial Port -handyboard@media.mit.edu (David Boosalis) (29-Jul-99 to lugnet.robotics.handyboard)](/news/x.gif) ![](/news/246.gif) ![You are here](/news/here.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
|
|
|
|