Return to BSD News archive
Xref: sserve comp.unix.bsd:12874 comp.unix.programmer:12912 comp.unix.questions:41390 Newsgroups: comp.unix.bsd,comp.unix.programmer,comp.unix.questions,bln.comp.unix,bln.comp.sun Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!elroy.jpl.nasa.gov!swrinde!cs.utexas.edu!uunet!Germany.EU.net!scotty!wegy!chris From: chris@wegy.waldorf-gmbh.de (Chris J. Mercer) Subject: Need 8 bit on the serial port (not only 7). Nntp-Posting-Host: wegy Keywords: BSD SERIAL PORT 8 BIT Sender: chris@wegy (Chris J. Mercer) Organization: Waldorf Electronics GmbH, Germany Date: Fri, 5 Nov 1993 10:09:55 GMT Message-ID: <1993Nov5.100955.15346@scotty.waldorf-gmbh.de> Lines: 122 I am writing a program on a MIPS Magnum, that I want to publish with the GPL-license. Luckily the MIPS allows you to choose between System V and BSD 4.3 . Unluckily the program does not work properly when I set the BSD-option. The only problem I have, is that the serial port only returns 7 bit and I need all 8 bit. The following program opens a tty and sets the sg_flags to raw as well as the local mode to LPASS8. I know that 8 bit are passed properly when writing to the port, and that the highest bit is stripped when reading. Does anyone have an idea what's wrong ? Could you test this program ? (It should compile like that, its only 90 lines.) If you should answer, please do it via e-mail, as we do not subscribe to these newsgroups. The test-program: ----------------------- snip here -------------------- #include <stdio.h> #include <sgtty.h> #include <fcntl.h> static fd_set rdfdset; static int ttyfd; static struct sgttyb mysgttyb; /* no control characters */ static struct tchars mytchars = {-1,-1,-1,-1,-1,-1}; #ifndef TTY_SERIAL #define TTY_SERIAL "/dev/tty1" #endif main () { int i, err; ttyfd=open(TTY_SERIAL,O_RDWR,0); /* open serial interface device */ if(ttyfd < 0) { fprintf(stderr,"initio() : Could not open %s\n", TTY_SERIAL); exit (ttyfd); } mysgttyb.sg_ispeed = B9600; mysgttyb.sg_ospeed = B9600; mysgttyb.sg_erase = 0xFF; /* hope this disables erase */ mysgttyb.sg_kill = 0xFF; /* hope this disables kill */ mysgttyb.sg_flags = (RAW); err = ioctl(ttyfd,TIOCSETP,&mysgttyb); if(err < 0) { perror("ioctl(ttyfd,TIOCGETP,&mysgttyb) :"); return err; } err = ioctl(ttyfd,TIOCSETC,&mytchars); if(err < 0) { perror("ioctl(ttyfd,TIOCSETC,&mytchars) :"); return err; } err = ioctl(ttyfd,TIOCSLTC,&mytchars); if(err < 0) { perror("ioctl(ttyfd,TIOCSLTC,&mytchars) :"); return err; } i = (LPASS8); err = ioctl(ttyfd,TIOCLSET,&i); if(err < 0) { perror("ioctl(ttyfd,TIOCLSET,&i) :"); return err; } /* simulate input. only works if you are root. Anyone know why ??? */ { char c=0xFD; printf ("ioctl=%d\n", ioctl(ttyfd, TIOCSTI, &c)); } readSerial(); } int readSerial () { unsigned char buf[512]; int i, nbytes; FD_ZERO(&rdfdset); FD_SET(ttyfd,&rdfdset); select(10,&rdfdset,0,0,0); if(FD_ISSET(ttyfd,&rdfdset)) { nbytes=read(ttyfd,buf,512); if(nbytes < 0) { perror("tty read error"); exit(1); } for (i=0; i<nbytes; ++i) printf ("readSerial():%d,%2X\n", i, buf[i]&255); } } --------------------- snip here again ------------------ Many Thanks in advance If you should answer, please do it via e-mail, as we do not subscribe to these newsgroups. Chris J. Mercer chris@waldorf-gmbh.de