*BSD News Article 61033


Return to BSD News archive

Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!news.bhp.com.au!mel.dit.csiro.au!munnari.OZ.AU!news.ecn.uoknor.edu!news.uoknor.edu!news.nodak.edu!netnews1.nwnet.net!news.u.washington.edu!uw-beaver!uhog.mit.edu!news.mathworks.com!tank.news.pipex.net!pipex!demon!arg-home.net-tel.co.uk
From: Andrew Gordon <andrew.gordon@net-tel.co.uk>
Newsgroups: comp.unix.bsd.freebsd.misc
Subject: Re: Some kind of trouble with reading /dev/cuaa?
Date: Fri, 02 Feb 1996 00:00:06 GMT
Lines: 115
Message-ID: <823219206.15342@arg-home.net-tel.co.uk>
References: <4eqci1$n66@bilbo.nask.org.pl>
NNTP-Posting-Host: arg-home.net-tel.co.uk
X-NNTP-Posting-Host: arg-home.net-tel.co.uk
X-Mailer: Mozilla 1.1N (X11; I; BSD/386 uname failed)
MIME-Version: 1.0
To: jarekb@pap.waw.pl
X-URL: file:/home/arg/term.c
Content-Type: multipart/mixed;
	boundary="-------------------------------9616503751178269702599720673"

This is a multi-part message in MIME format.

---------------------------------9616503751178269702599720673
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=us-ascii

jarekb@pap.waw.pl (Jaroslaw Bazydlo) wrote:
>A Few days I go I replaced a direct connection with a modem line and it
>stopped working ;-(. What I have to do first is to set 1200 8N1 parameters of
>my port. This is my script (a modified part of rc.serial):

I expect your problem relates to waiting for carrier detect or CTS, but I can't
readily tell from the info you've given.  Try reading the termios man page, and
looking at the enclosed example code.

---------------------------------9616503751178269702599720673
Content-Transfer-Encoding: 7bit
Content-Type: text/plain

#include <stdio.h>
#include <sys/uio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

/*
  Simple dumb terminal example program
*/

int main(int argc, char **argv)
{
  int serial_fd;
  char *portname;
  struct termios term;
  struct termios saved_term;
  fd_set fd_map;

  if (argc > 1) portname = argv[1];
  else portname = "/dev/cuaa0";

  /* Open the port.  NB. without O_NONBLOCK, this would wait until the	*/
  /* modem raises carrier detect.					*/
  serial_fd = open(portname, O_RDWR | O_NONBLOCK);
  if (serial_fd < 0)
  {
    perror(portname);
    exit(1);
  }
  printf("Serial port now open\n");

  /* Adjust the port settings.  This is done by reading the  current	*/
  /* setings into memory, making any desired change to that in-memory	*/
  /* copy, then writing them back into the terminal device so that all	*/
  /* the changes come into effect.  See termios(4) man page for detail	*/

  /* Read the current terminal settings into memory			*/
  tcgetattr(serial_fd, &term);
  /* Adjust the port speed						*/
  cfsetspeed(&term, B1200);
  /* Turn off canonical processing (line buffer, backspace etc)		*/
  cfmakeraw(&term);
  /* Turn of carrier detect (ie. make /dev/ttyd0 work like cuaa0	*/
  term.c_cflag |= CLOCAL | CREAD;
  /* Turn off RTS/CTS flow control (probably off anyhow, but make sure)	*/
  term.c_cflag &= ~(CCTS_OFLOW | CRTS_IFLOW);
  /* Now write these changes out so they take effect.		*/
  tcsetattr(serial_fd, TCSANOW, &term);

  printf("Serial port now configured\n");

  /* Similarly, disable line buffering of the keyboard		*/
  /* but remember the old settings to restore on exit		*/
  tcgetattr(STDIN_FILENO, &term);
  saved_term = term;
  cfmakeraw(&term);
  tcsetattr(STDIN_FILENO, TCSANOW, &term);

  /* Finished setting terminal, go into a loop reading bytes from	*/
  /* either keyboard or serial line as appropriate			*/
  FD_ZERO(&fd_map);
  while (1)
  {
    unsigned char buf[100];
    int i;

    FD_SET(serial_fd, &fd_map);
    FD_SET(STDIN_FILENO, &fd_map);
    if ((i = select(FD_SETSIZE, &fd_map, NULL, NULL, NULL)) < 0)
    {
      /* select returns error					*/
      perror("select");
      exit(1);
    }
    /* Here with either the keyboard or the serial line ready to read	*/
    if (FD_ISSET(serial_fd, &fd_map))
    {
      i = read(serial_fd, buf, sizeof(buf));
      write(STDOUT_FILENO, buf, i);
    }
    if (FD_ISSET(STDIN_FILENO, &fd_map))
    {
      i = read(STDIN_FILENO, buf, sizeof(buf));
      write(serial_fd, buf, i);
      if (*buf == 3)
      {
	/* User typed ctrl-C.  Put the keyboard back to normal and exit	*/
        tcsetattr(STDIN_FILENO, TCSANOW, &saved_term);
	exit(0);
      }
    }
  }
}

---------------------------------9616503751178269702599720673--