linux打开串口样板

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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屁小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值