How to programm TTY devices under UNIX platform?

Dear Export,

I want to begin an serial-communication application codes associated with TTY devices. But I don't know what key settings should be concerned after opening a TTY device file under UNIX plarform(SunOS 5.7)?

Could you give me some adivce? Thanks!

Check your system's man pages on...

termio (and/or termios)
ioctl
read
write

Thank you, rwb1959,

Actually I have a look at man pages of TERMIO. But you know, it is simple that some contents mentioned is still not clear to me. the most puzzling question is How to set the value of BAUD to a opened TTY file? And what is the detailed reason?

Looking forward to you reply!

There is the old unix way to do this and the new posix way. I wrote a program to put the tty into raw mode using both methods so I could compare them. You should probably understand both techniques since there is a lot of old code out there. But I think the posix revision is a win, so I would suggest going the posix route with new code. I would add the following man pages to your list:

tcattribute(3c)
cfspeed(3C)
tccontrol(3C)

You should use the routines in cfspeed(3C) to change the baud rate.

Here is the sample program that I wrote:

/*   #define OLD_TERMIO  */

#ifdef __STDC__
#define PROTOTYPICAL
#endif
#ifdef __cplusplus
#define PROTOTYPICAL
#endif

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifdef OLD_TERMIO
#include <termio.h>
#else
#include <termios.h>
#endif

#ifdef PROTOTYPICAL
int main(int argc, char *argv[])
#else
main(argc,argv)
char *argv[];
#endif

{
#ifdef OLD_TERMIO
        struct termio orig,now;
#else
        struct termios orig,now;
#endif
        int c, i, rc, done;
        setvbuf(stdout, NULL, _IONBF ,0);

#ifdef OLD_TERMIO
        ioctl(0, TCGETA, (char *) &orig);
#else
        tcgetattr(0, &orig);
#endif
        now=orig;
        now.c_lflag &= ~(ISIG|ICANON|ECHO);
        now.c_cc[VMIN]=1;
        now.c_cc[VTIME]=2;
#ifdef OLD_TERMIO
        ioctl(0,TCSETA, (char *) &now);
#else
        tcsetattr(0, TCSANOW, &now);
#endif
        done=0;
        while(!done) {
                printf("hit a key: ");
                c=getchar();
                printf(" got a  %03X \n", c);
                done = c=='q';
        }
#ifdef OLD_TERMIO
        ioctl(0,TCSETA, (char *) &orig);
#else
        tcsetattr(0, TCSANOW, &orig);
#endif
        exit(0);
}

Perderabo is most correct. The Posix way
is certainly cleaner in general.
Sometimes old guys like me have
a hard time letting go :smiley:

Thank you! Perderabo.

I would like to try your dedication.

Maybe you know, I work now on the SunOS 5.7 platform. Surely I have looked up the TERMIOS library. But I could not find that thress functions listed in your mail as follows:

tcattribute(3c)
cfspeed(3C)
tccontrol(3C)

I know, the SunOS 5.7 should obey to the POSIX standard. But where these functions?

Another one, would you like tell me what do you mean by the 'win' in your mail? I guess if it is "what is needed'?

Thanks again!

Sun does a fairly reasonable job of complying with posix. There is no standard for exactly where to put information in the man pages. On Sun, start with the termio man page and look at all the man pages it references in the "SEE ALSO" section.

From dictionary.com:

Hi!

     Here's a very nice website on Serial Communications:

http://www.easysw.com/~mike/serial/serial.html

Regards
SHAIK

SHAIK,

Thanks for your help!

It is really terrific stuff!

Thanks again!

Wayne Yang