int OpenTTY(char *dev, int baudrate)
{
int fdcom = -1;
struct termios termios_old, termios_new;
int tmpbaudrate = -1;
int tmp = -1;
char databit, stopbit, parity;
bzero(&termios_old, sizeof(termios_old));
bzero(&termios_new, sizeof(termios_new));
fdcom = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY);
if (fdcom < 0)
{
dzlog_error("tty open %s failed",dev);
return fdcom;
}
cfmakeraw(&termios_new);
if(0 != tcgetattr(fdcom, &termios_old))
{
dzlog_error("tty tcgetattr fail");
}
tmpbaudrate = ConBaurate(baudrate);
if(-1 == cfsetispeed(&termios_new, tmpbaudrate))
{
dzlog_debug("tty cfsetispeed fail %d",tmpbaudrate);
} else {
dzlog_debug("tty cfsetispeed sucess %d",tmpbaudrate);
}
if(-1 == cfsetospeed(&termios_new, tmpbaudrate))
{
dzlog_debug("tty cfsetospeed fail %d",tmpbaudrate);
} else {
dzlog_debug("tty cfsetospeed sucess %d",tmpbaudrate);
}
termios_new.c_cflag |= (CLOCAL | CREAD);
termios_new.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
termios_new.c_cflag &= ~CSIZE;
databit = 8;
switch (databit)
{
case '5':
termios_new.c_cflag |= CS5;
case '6':
termios_new.c_cflag |= CS6;
case '7':
termios_new.c_cflag |= CS7;
default:
termios_new.c_cflag |= CS8;
}
parity = 0;
switch (parity)
{
case '0':
{
termios_new.c_cflag &= ~PARENB;
}
break;
case '1':
{
termios_new.c_cflag |= PARENB;
termios_new.c_cflag |= PARODD;
}
break;
case '2':
{
termios_new.c_cflag |= PARENB;
termios_new.c_cflag = ~PARODD;
}
break;
case '3':
{
termios_new.c_cflag = ~PARENB;
}
}
stopbit = '1';
if (stopbit == '2')
{
termios_new.c_cflag |= CSTOPB;
} else
{
termios_new.c_cflag &= ~CSTOPB;
}
termios_new.c_oflag &= ~OPOST;
termios_new.c_oflag &= ~(ONLCR | ICRNL);
termios_new.c_iflag &= ~(ICRNL | INLCR);
termios_new.c_iflag &= ~(IXON | IXOFF | IXANY);
termios_new.c_cc[VMIN] = 0;
termios_new.c_cc[VTIME] = 0;
tcflush(fdcom, TCIFLUSH);
tmp = tcsetattr(fdcom, TCSANOW, &termios_new);
if(tmp != 0)
{
dzlog_debug("tty tcsetattr fail");
}
return fdcom;
}