串口设置(波特率、数据位、校验位、停止位)

串口终端设备的接口属性如下:

struct termios
{
	tcflag_t c_cflag;   //控制标志
	tcflag_t c_iflag;   //输入标志
	tcflag_t c_oflag;   //输出标志
	tcflag_t c_lflag;   //本地标志
	tcflag_t c_cc[NCCS];//控制字符
}

其中定义类型如下:

typedef unsigned int tcflag_t;

需要包含的头文件<termios.h>
下面介绍一下各个标志的选项

控制标志c_cflag:

波特率相关:

标志说明标志说明
CBAUD波特率位屏蔽B48004800 位/秒
B00 位/秒(挂起)B96009600 位/秒
B110100 位/秒B1920019200 位/秒
B134134 位/秒B5760057600 位/秒
B12001200 位/秒B115200115200 位/秒
B24002400 位/秒B460800460800 位/秒

数据位相关:

标志说明
CSIZE数据位屏蔽
CS55 位数据位
CS66 位数据位
CS77 位数据位
CS88 位数据位

停止位相关:

标志说明
CSTOPB2 位停止位,否则为 1 位

校验位:

标志说明
PARENB进行奇偶校验
PARODD奇校验,否则为偶校验

其他:

标志说明
CREAD启动接收
HUPCL最后关闭时断开
CLOCAL忽略调制调解器状态行

输入标志c_iflag:

标志说明标志说明
INPCK打开输入奇偶校验IXOFF启用/停止输入控制流起作用
IGNPAR忽略奇偶错字符IGNBRK忽略BREAK条件
PARMRK标记奇偶错字符INLCR讲输入的NL转换为CR
ISTRIP剥除字符第八位IGNCR忽略CR
IXON启用/停止输出控制流起作用ICRNL将输入的CR转换为NL

输出标志c_oflag:

标志说明
BSDLY退格延迟屏蔽OLCUC将输出的小写字符转换为大写字符
CMSPAR标志或空奇偶性ONLCR将 NL 转换为 CR-NL
CRDLYCR 延迟屏蔽ONLRETNL 执行 CR 功能
FFDLY换页延迟屏蔽ONOCR在 0 列不输出 CR
OCRNL将输出的 CR 转换为 NLOPOST执行输出处理
OFDEL填充符为 DEL,否则为 NULLOXTABS将制表符扩充为空格
OFILL对于延迟使用填充符

本地标志c_lflag:

标志说明标志说明
ISIG启用终端产生的信号NOFLSH在中断或退出键后禁用刷清
ICANON启用规范输入IEXTEN启用扩充的输入字符处理
XCASE规范大/小写表示ECHOCTL回送控制字符为(char)
ECHO进行回送ECHOPRT硬拷贝的可见擦除方式
ECHOE可见擦除字符ECHOKEKill 的可见擦除
ECHOK回送 kill 符PENDIN重新打印未决输入
ECHONL回送 NLTOSTOP对于后台输出发送 SIGTTOU

控制字符组:

标志说明标志说明
VINTR中断VEOL行结束
VQUIT退出VMIN需读取的最小字节数
VERASE擦除VTIME与“VMIN”配合使用,是指限定的传输或等待的最长时间
VEOF行结束

示例代码:

#include <stdio.h>
#include <termios.h>
#include <fcntl.h>

#define TRUE 1
#define FALSE (-1)

int serialAttr(int baudrate, int databit, char paritybit, int stopbit);

int main(void)
{
	serialAttr(9600, 8, 'N', 1);

	return 0;
}

int serialAttr(int baudrate, int databit, char paritybit, int stopbit)
{
	int fd;
	fd = open("/dev/ttyx",O_RDWR | O_NOCTTY); //读写方式打开;不作为控制终端
	if(fd == -1)
	{
		return FALSE;
	}

	/*更改波特率*/
	int status;
	struct termios opt;
	tcgetattr(fd,&opt);//获取终端参数
	tcflush(fd,TCIOFLUSH);//刷清输入输出缓存
	cfsetispeed(&opt,baudrate);//设置输入的波特类
	cfsetospeed(&opt,baudrate);//设置输出的波特类

	/*数据位、停止位、校验位*/
	opt.c_cflag |= (CLOCAL | CREAD);
	opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//原始模式,输入数据不经处理
	opt.c_oflag &= ~OPOST; //原始输出
	opt.c_iflag &= ~(BRKINT | ICRNL | ISTRIP | IXON);
	opt.c_cflag &= ~CSIZE; //数据位清零

	switch (databit)  //数据位
	{    
		case 7:
			opt.c_cflag |= CS7;break;
		case 8:
			opt.c_cflag |= CS8;break;
		default:
			fprintf(stderr,"Unsupported data size\n");
			return (FALSE);
	}


	switch (paritybit) //校验位
	{
		case 'n': 
		case 'N':
			opt.c_cflag &= ~PARENB;   // 不校验
			opt.c_iflag &= ~INPCK;     //关闭输入奇偶校验
			opt.c_iflag &= ~(ICRNL|IGNCR);
			opt.c_lflag &= ~(ICANON ); //不规范输入
			break;

		case 'o': //奇校验
		case 'O':
			opt.c_cflag |= PARENB; //进行奇偶校验
			opt.c_cflag |= PARODD; //奇校验,否则为偶校验
			opt.c_iflag |= INPCK;  //打开输入奇偶校验
			break;

		case 'e': //偶校验
		case 'E':
			opt.c_cflag |= PARENB;     // 进行奇偶校验
			opt.c_cflag &= ~PARODD;    //偶校验
			opt.c_iflag |= INPCK;     //打开输入奇偶校验
			break;

		case 'S': 
		case 's':  /*as no parity*/
			opt.c_cflag &= ~PARENB; //不进行奇偶校验
			opt.c_cflag &= ~CSTOPB; //1 位停止位
			break;

		default:
			fprintf(stderr,"Unsupported parity bit\n");
			return (FALSE);
	}

	switch (stopbit)  //停止位
	{
		case 1:
			opt.c_cflag &= ~CSTOPB;break; //1 位停止位
		case 2:
			opt.c_cflag |= CSTOPB;break; //2 位停止位,否则为 1 位
		default:
			fprintf(stderr,"Unsupported stop bit\n");
			return (FALSE);
	}

	opt.c_cc[VTIME] = 150; // 等待数据到达的分秒数(秒的 1/10 为分秒)
	opt.c_cc[VMIN] = 0; // read 调用期望返回的最小字节数
	tcflush(fd,TCIFLUSH); // 刷清输入缓存区
	if (tcsetattr(fd,TCSANOW,&opt) != 0) //TCSANOW:不等数据传输完毕就立即改变属性。
	{
		perror("Setup serial port fail\n");
		return FALSE;
	}
	else
	{
		return TRUE;
	}
}

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值