Files
libnodave/setport.c
2015-03-16 10:19:07 +00:00

132 lines
4.0 KiB
C

/*
Part of Libnodave, a free communication libray for Siemens S7 300/400.
(C) Thomas Hergenhahn (thomas.hergenhahn@web.de) 2001.
Libnodave is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
Libnodave is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
//#ifdef __cplusplus // some people try to compile this with C++ compilers...
// Then the linker will expect mangled names, but libnodave dont have them.
//extern "C" {
//#endif
#include <termios.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#include "setport.h"
#define debug 0
#define ThisModule "setPort : "
int setPort(char * name, char* baud,char parity)
{
int fd,res;
struct termios oldtio, newtio;
// fd = open(name, O_RDWR | O_NOCTTY | O_NONBLOCK);
fd = open(name, O_RDWR | O_NOCTTY);
#if debug >3
printf(ThisModule "%s = %d\n", name, fd);
#endif
// res=fcntl(fd, F_SETFL, 0x2000 /* FASYNC */ );
#if debug >3
printf(ThisModule "fcntl: %s\n", strerror(errno));
#endif
tcgetattr(fd, &oldtio); // save current settings
#if debug >3
printf(ThisModule "tcget...:%s\n", strerror(errno));
#endif
// set new port settings for noncanonical input processing:
if (0==strncmp(baud,"115200",6))
newtio.c_cflag = B115200;
else if (0==strncmp(baud,"57600",5))
newtio.c_cflag = B57600;
else if (0==strncmp(baud,"38400",5))
newtio.c_cflag = B38400;
else if (0==strncmp(baud,"19200",5))
newtio.c_cflag = B19200;
else if (0==strncmp(baud,"9600",4))
newtio.c_cflag = B9600;
else if (0==strncmp(baud,"4800",4))
newtio.c_cflag = B4800;
else if (0==strncmp(baud,"2400",4))
newtio.c_cflag = B2400;
else if (0==strncmp(baud,"1200",4))
newtio.c_cflag = B1200;
else if (0==strncmp(baud,"600",3))
newtio.c_cflag = B600;
else if (0==strncmp(baud,"300",3))
newtio.c_cflag = B300;
else
printf(ThisModule "illegal Baudrate: %s\n", baud);
parity=tolower(parity);
if (parity == 'e')
// newtio.c_cflag = newtio.c_cflag & (~PARODD | PARENB); // wrong !!
// newtio.c_cflag = newtio.c_cflag & ~PARODD | PARENB; // gives compiler warning
newtio.c_cflag = (newtio.c_cflag & ~PARODD) | PARENB;
else if (parity == 'o')
newtio.c_cflag = newtio.c_cflag | PARODD | PARENB;
else if (parity == 'n')
newtio.c_cflag = newtio.c_cflag & ~(PARODD | PARENB);
else
printf(ThisModule "illegal parity mode:%c\n", parity);
newtio.c_cflag |= CS8; // should allways be eight bit
newtio.c_cflag = newtio.c_cflag | CLOCAL | CREAD;
newtio.c_iflag = 0; // {IGNPAR |} ICRNL;
newtio.c_oflag = ONOCR;
newtio.c_lflag = 0; //ICANON
newtio.c_cc[VMIN] = 1;
newtio.c_cc[VTIME] = 0;
tcflush(fd, TCIFLUSH);
#if debug >3
printf(ThisModule "tcflush:%s\n", strerror(errno));
#endif
tcsetattr(fd, TCSANOW, &newtio);
#if debug >3
printf(ThisModule "tcset...:%s\n", strerror(errno));
#endif
return (fd);
}
/*
Not acting on -1 is just a kludge for s7online. See comment in nodave.c before
daveDisconnectAdapterS7online for detailed explanation.
*/
int closePort(int port){
int res=0;
if (port!=-1)
res=close(port);
return res;
}
//#ifdef __cplusplus
// }
//#endif
/*
Changes:
02/12/2002 change output statements to printf, this gives less code size.
06/21/2002 * got rid of some warnings
10/04/2003 fixed an error with parity even
Version 0.8.4.5
07/12/09 Changed flags in setport.c. Older version does not work with recent Linux
kernels.
*/