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);
//1.保存原先串口配置,可以测试配置是否正确、该串口是否可用
if(0 != tcgetattr(fdcom, &termios_old))
{
dzlog_error("tty tcgetattr fail");
}
// attributions
// baudrates
tmpbaudrate = ConBaurate(baudrate);
//2.设置波特率
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);
}
//3.激活选项 CLOCAL和CREAD分别用于本地连接和接收使能
termios_new.c_cflag |= (CLOCAL | CREAD);
termios_new.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/*
* fctl = pportinfo-> fctl; switch(fctl){ case '0':{
* termios_new.c_cflag &= ~CRTSCTS; //no flow control }break; case
* '1':{ termios_new.c_cflag |= CRTSCTS; //hardware flow control
* }break; case '2':{ termios_new.c_iflag |= IXON | IXOFF |IXANY;
* //software flow control }break; }
*/
//4.设置字符大小
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;
}
//5.设置奇偶校验位
parity = 0;
switch (parity)
{
case '0':
{
termios_new.c_cflag &= ~PARENB; // no parity check
}
break;
case '1':
{
termios_new.c_cflag |= PARENB; // odd check
termios_new.c_cflag |= PARODD;
}
break;
case '2':
{
termios_new.c_cflag |= PARENB; // even check
termios_new.c_cflag = ~PARODD;
}
break;
case '3':
{
termios_new.c_cflag = ~PARENB; // space check
}
}
//6.设置停止位
stopbit = '1';
if (stopbit == '2')
{
termios_new.c_cflag |= CSTOPB; // 2 stop bits
} else
{
termios_new.c_cflag &= ~CSTOPB; // 1 stop bits
}
// other attributions default
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;//读取第一个字符的等待时间
//8.清除串口缓冲
tcflush(fdcom, TCIFLUSH);
//9.激活配置
tmp = tcsetattr(fdcom, TCSANOW, &termios_new);
if(tmp != 0)
{
dzlog_debug("tty tcsetattr fail");
}
return fdcom;
}
linux打开串口样板
最新推荐文章于 2025-04-21 21:20:16 发布
354

被折叠的 条评论
为什么被折叠?



