linux中设置串口的系统调用tcgetattr,tcsetattr,tcflush的使用总结

本文主要是介绍linux中设置串口的系统调用tcgetattr,tcsetattr,tcflush的使用总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

头文件:
#include <termios.h>
函数原型:
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);//设置串口属性

int tcgetattr(int fd, struct termios *termios_p);//获得串口属性

int tcflush(int fd, int queue_selector);//刷新串口的缓冲区

speed_t cfgetispeed(struct termios *termios_p);//获得输入速度

speed_t cfgetospeed(struct termios *termios_p);//获得输出速度

int cfsetispeed(struct termios *termios_p, speed_t speed);

int cfsetospeed(struct termios *temios_p, speed_t speed);

参数:

int fd:是打开的串口终端的文件描述符。如:/dev/ttyS0

 

struct termios *termios_p:存放参数的结构体的指针。

具体参见:https://baike.baidu.com/item/Termios/1467529?fr=aladdin

 

int optional_actions:用于控制修改起作用的时间,可以使用如下的取值:

TCSANOW:不等数据传输完毕立即改变属性。

TCSADRAIN:等所有的数据传输完毕才改变属性。

TCSAFLUSH:等所有的数据传输完毕,并且清空输入输出的缓冲区才改变属性。

 

int queue_selector:代表刷新的具体的缓冲区,可以有如下的取值:

TCIFLUSH:刷新输入缓冲区。

TCOFLUSH:刷新输出缓冲区。

TCIOFLUSH:刷新输入输出缓冲区。


如下为,实例;

int Uart0_Init(void)
{const char *path_utf = "/dev/ttyS0";printf("Open Uart0Init!! \n");if (uart0_fd == -1){uart0_fd = open(path_utf, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); if(uart0_fd == -1){printf("Failed to open serial port %s, %s\n", path_utf, strerror(errno));return -1;}printf("Open Uart0 OK!! \n");}/* Configure device */struct termios newtio, oldtio;if ( tcgetattr(uart0_fd, &oldtio ) != 0) {  perror("tcgetattr error");return -1;}//tcflush(fd, TCIOFLUSH);bzero( &newtio, sizeof(newtio) );newtio.c_cflag |= CLOCAL | CREAD;newtio.c_cflag &= ~CSIZE;newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);newtio.c_oflag &= ~OPOST;newtio.c_oflag &= ~(ONLCR | INLCR);newtio.c_iflag &= ~(ICRNL | INLCR);newtio.c_iflag &= ~(IXON | IXOFF | IXANY);//newtio.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOE | IEXTEN);//newtio.c_oflag &= ~OPOST;//newtio.c_iflag &= ~(IXON | IXOFF | IXANY | ICRNL | BRKINT | INPCK | ISTRIP);//newtio.c_cflag &= ~CRTSCTS;newtio.c_cflag |= CS8;newtio.c_cflag &= ~PARENB;//   cfsetispeed(&newtio, B115200);//   cfsetospeed(&newtio, B115200);cfsetispeed(&newtio, B230400);cfsetospeed(&newtio, B230400);	newtio.c_cflag &= ~CSTOPB;newtio.c_cc[VTIME] = 0;newtio.c_cc[VMIN] = 0;tcflush(uart0_fd, TCIOFLUSH);if ((tcsetattr(uart0_fd, TCSANOW, &newtio)) != 0) {perror("set opt error");return -1;}return uart0_fd;
}
int Uart1Init(void)
{const char *path_utf = "/dev/ttyS1";int fd = -1;
//	speed_t speed = B115200;//speed_t speed = B230400;//fd = open(path_utf, O_RDWR | O_NOCTTY);fd = open(path_utf, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);if(fd == -1){printf("Failed to open serial --1-- port %s,\n", path_utf);return -1;}printf("Open Uart1 OK!! \n");/* Configure device */struct termios newtio, oldtio;if ( tcgetattr( fd, &oldtio ) != 0) {perror("tcgetattr error");return -1;}//tcflush(fd, TCIOFLUSH);bzero( &newtio, sizeof(newtio) );newtio.c_cflag |= CLOCAL | CREAD;newtio.c_cflag &= ~CSIZE;newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);newtio.c_oflag &= ~OPOST;newtio.c_oflag &= ~(ONLCR | INLCR);newtio.c_iflag &= ~(ICRNL | INLCR);newtio.c_iflag &= ~(IXON | IXOFF | IXANY);//newtio.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOE | IEXTEN);//newtio.c_oflag &= ~OPOST;//newtio.c_iflag &= ~(IXON | IXOFF | IXANY | ICRNL | BRKINT | INPCK | ISTRIP);//newtio.c_cflag &= ~CRTSCTS;newtio.c_cflag |= CS8;newtio.c_cflag &= ~PARENB;//  cfsetispeed(&newtio, B115200);//  cfsetospeed(&newtio, B115200);cfsetispeed(&newtio, B230400);cfsetospeed(&newtio, B230400);newtio.c_cflag &= ~CSTOPB;newtio.c_cc[VTIME] = 0;newtio.c_cc[VMIN] = 0;tcflush(fd, TCIOFLUSH);if ((tcsetattr(fd, TCSANOW, &newtio)) != 0) {perror("set opt error");return -1;}uart_fd = fd;printf("fd-open=%d\n",fd);// InitSocket();/**************************************************************************/return fd;
}

 

 

 

 

 

这篇关于linux中设置串口的系统调用tcgetattr,tcsetattr,tcflush的使用总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978660

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功