A question about programming RS-232

Andrew Falanga af300wsm at gmail.com
Wed Sep 6 17:13:47 PDT 2006


I am by no means the worlds best serial programmer, but recently I have done
some work on this subject and I noticed one thing in the code sample above
that should be avoided.  However, I'll give you what I saw in-line:


#include <stdio.h>
> #include <termios.h>
> #include <unistd.h>
> #include <fcntl.h>
>
> int main(void) {
> int t = 0, num = 10, fd, iOut; char *ch;
> struct termios my_termios;
> ch = (char *)malloc(6);
> memset(ch, 250, 6);
> fd = open("/dev/cuad0", O_RDWR | O_NONBLOCK);


Ok, great, we've opened our serial device.  Unless you need this to be a
controlling terminal, you should open with open( "/dev/cuad0", O_RDWR |
O_NONBLOCK | O_NOCTTY );  Check with the open man page to make sure I've
given you the correct constant for opening as a non-controlling terminal.


printf("Opened com port\n");
> if(fd < 0) return 0;
> // tcflush(fd, TCIFLUSH);
> my_termios.c_cflag = CS8 | CLOCAL;
> if(cfsetspeed(&my_termios, B9600) < 0) return 0;
> if(tcsetattr(fd, TCSANOW, &my_termios) < 0) return 0;


You've set the attributes you want to use in the structure you defined,
my_termios.  However, you should call tcgetattr() before changing what you
want to change (and make sure you always turn things on as you have done
above with bitwise or).  So, your code should look something like,

// assume an open file descriptor named fd
struct termios my_termios;

if( tcgetattr( fd, &my_termios ) < 0 ) {
   fprintf( stderr, "error in getting termios properties\n" );
   return AN_ERROR;
}

// turn on what you want
my_termios.c_cflag = CS8 | CLOCAL;

if( tcsetattr( fd, &my_termios ) < 0 } {
   fprintf( stderr, "error in setting new properties to serial port\n" );
   return AN_ERROR;
}


I don't know if this will solve your problems but I do know I read that you
should always get the current settings because the serial driver may use
certain bits and you don't want to turn them off.  Also, if you're going to
return the port settings to the state before you took hold of it, make two
termios structures and stuff the original settings away to be restored upon
exit or close of the port.

Lastly, here is a link to a serial programming guide that I found quite
helpful.  The info is probably dated to some degree, but it is non the less
useful.

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

Andy


More information about the freebsd-questions mailing list