(转自:https://blog.csdn.net/williamwang2013/article/details/8560552)

linux使用terminfo数据库来描述终端能力以及调用对应功能的方法

POSIX定义了完成终端I/O的标准方法:TERMIOS函数族

#include <termios.h>

#include <unistd.h>

struct termios{

tcflag_t c_iflag;      /* input modes */

tcflag_t c_oflag;      /* output modes */

tcflag_t c_cflag;      /* control modes */

tcflag_t c_lflag;      /* local modes */

cc_t c_cc [NCCS];      /* control chars */

}

1.模式

Cbreak模式

除了"Del"和"Ctrl"键外,接受其他所有字符输入,数都可以禁止行缓冲(line buffering)。控制字符将被终端驱动程序解释成其它字符。

Raw模式

可以禁止行缓冲(line buffering),处理挂起(CTRLZ)、中断或退出(CTRLC)等控制字符时,将直接传送给程序去处理而不产生终端信号

详情查看curses库中的cbreak()和 raw()函数。

另外可以用命令直接操作

stty -a    这个命令用来查看当前终端的设置情况

stty sane    如果不小心设错了终端模式,可用这个命令恢复,另一种恢复办法是在设置之前保存当前stty设置,在需要时再读出

stty -g > save_stty    将当前设置保存到文件save_atty中

stty $(cat save_stty)    读出save_atty文件,恢复原终端设置

2.获取和设置终端属性

int tcgetattr(int fd, struct termios *termios_p);

int tcsetattr(int fd, int optional_actions, struct termios *termios_p);

其中optional_actions决定什么时候起作用,可取如下值

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

TCSADRAIN:等待所有数据传输结束才改变属性。

TCSAFLUSH:清空输入输出缓冲区才改变属性。

注意:当进行多重修改时,应当在这个函数之后再次调用 tcgetattr() 来检测是否所有修改都成功实现。

3.波特率函数

获取波特率

speed_t cfgetospeed(struct termios *termios_p);

speed_t cfgetispeed(struct termios *termios_p);

设置波特率

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

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

4.线路控制函数

int tcdrain (int fd);    //等待所有写入fd中的数据输出

int tcflush (int fd, int queue_selector);    //丢弃要写入fd,但尚未传输的数据,或者收到但是尚未读取的数据。

取决于queue_selector 的值:

TCIFLUSH

刷新收到的数据但是不读

TCOFLUSH

刷新写入的数据但是不传送

TCIOFLUSH

同时刷新收到的数据但是不读,并且刷新写入的数据但是不传送

int tcflow (int fd, int action);    //挂起 fd 上的数据传输或接收。

取决于 action 的值:

TCOOFF

挂起输出

TCOON

重新开始被挂起的输出

TCIOFF

发送一个 STOP 字符,停止终端设备向系统传送数据

TCION

发送一个 START 字符,使终端设备向系统传输数据

打开一个终端设备时的默认设置是输入和输出都没有挂起。

int tcsendbreak (int fd, int duration);    //传送连续的 0 值比特流,持续一段时间,如果终端使用异步串行数据传输的话。

如果 duration 是 0,它至少传输 0.25 秒,不会超过 0.5 秒。如果 duration 非零,它发送的时间长度由实现定义。

如果终端并非使用异步串行数据传输,tcsendbreak() 什么都不做。

5.进程组控制函数

pid_t tcgetpgrp(int fd);    //获取前台进程组的进程组ID

int tcsetpgrp(int fd, pid_t pgrpid);    //设置前台进程组的进程组ID

pid_t tcgetsid(int fd);    //获取会话首进程的进程组ID

6.cfmakeraw

设置终端的 Raw 模式 ,设置终端属性:

termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP| INLCR | IGNCR | ICRNL | IXON);

termios_p->c_oflag &= ~OPOST;

termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);

termios_p->c_cflag &= ~(CSIZE | PARENB);

termios_p->c_cflag |= CS8;

7.其他

#include <stdio.h>

char *ctermid(char *s);         //决定控制终端名称

#include <unistd.h>

int isatty(int desc);          //判断描述符是否为终端

char *ttyname(int desc);       //返回终端名称

int getopt(int argc,char * const argv[ ],const char * optstring);    //分析命令行参数

其中argc和argv是由main()传递的参数个数和内容,optstring 则代表欲处理的选项字符串。

串口termios函数【转】相关推荐

  1. Termios 函数说明

    Termios 函数说明: Linux中的控制台界面,要大量用到Termios库的内容.但是总的来看,这些东西已经过时了,应该用更简单的方案来代替它了,尽管它是POSIX标准的一部分. 然而现在,时代 ...

  2. linux串口termios

    linux串口termios NAME termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, ...

  3. STM8学习笔记---串口printf函数的实现

    在使用单片机的时候,串口是要经常使用的功能,特别是在调试代码的过程中,经常需要使用串口打印出某些变量值,来判断程序执行流程是否正常.但是单片机默认情况下没有printf函数,如果需要使用printf函 ...

  4. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(串口发送函数)

    一.开发板平台简介: 1.开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex ...

  5. DIY单片机串口打印函数print

    原始的单片机串口只能发送单字节数据,再加个封装也就能发送个字符串,但是无法发送数字变量,要发送数字变量那基本要引入C语言的库函数printf,但是这个pintf函数 好用确实是好用但是有个很大的缺点相 ...

  6. 学习笔记——stm32串口中断函数的逻辑理解

    这片文章主要是讲解原子给的代码里面的串口中断的中断函数,前面是我个人的学习路径. 关于stm32串口的学习,主要分为以下几个点 1.USART的功能和内部结构. 功能包括同步.异步模式.双工通信.半工 ...

  7. 51单片机串口打印函数

    51单片机串口通信调试printf函数重定向输出打印 1.首先需要实现串口的发送和接收. 2.输出printf需要哪些步骤: 1)需要引入头文件 <stdio.h> 2)添加如下代码: c ...

  8. STM32多串口printf函数

    1.配置usart2的串口配置,gpio,rcc enable,跟上面类似 2.勾选usb micro lib,跟上面类似 3.添加头文件#include <stdarg.h>,编写USA ...

  9. windows串口通信函数API

    windows串口通讯主要函数 先列个目录表 1.CreateFile - 打开串口: 2.SetupComm-初始化一个指定的通信设备的通信参数 3.ReadFile - 读数据: 4.WriteF ...

最新文章

  1. python技术晨讲_python系列教程14
  2. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — SKB
  3. 【iOS 开发】Objective-C 入门 Xcode 环境详解
  4. LaTeX参考文献中遇到错误:Missing $ inserted. [\printbibliography[heading=bibintoc]]
  5. linux 端口 镜像吗,Linux如何实现镜像端口
  6. Java JVM 汇编代码入门 GitChat链接
  7. 怎么实现hover_web前端CSS实现一个粒子动效的按钮
  8. hibernate连接mysql 释放连接_SSH 占用数据库连接不释放问题
  9. 获取数据后插入到jsp页面(自用,没内容)
  10. linux用户管理命令 2
  11. DBCC PAGE、DBCC LOG、DBCC EXTENTINFO、DBCC IND、DBCC SHOW_STATISTICS、DBCC SHOWCONTIG、DBCC SQLPERF...
  12. UMHexagonS算法优化
  13. Oracle连续排名,oracle不连续排名rank() over(order by column desc),连续排名 dense_rank over(order by)...
  14. linux读写进程内存函数,Linux内核模块里的读写函数
  15. 葵花卫星数据介绍与下载教程
  16. php完全匹配,PHP完全匹配验证
  17. 比特精灵是计算机病毒吗,[病毒防治]靠,我居然也中木马?
  18. 关于nova服务项目的使用方法
  19. FTP登录不上 显示“找不到元素” windows无法访问此文件夹,请确保输入的文件名是否正确,并且您有权访问此文件
  20. 批量更改图像分辨率到统一大小

热门文章

  1. git长时间未清理无法拉取代码( git Auto packing the repository in background for optimum performance)
  2. python串口编程视频_python 串口编程
  3. 2023全新FL Studio 21中文版水果编曲制作软件下载安装教程
  4. 【读书笔记】《月亮与六便士》- [英] 威廉·萨默塞特·毛姆 - 1919年出版
  5. P3201 [HNOI2009] 梦幻布丁 启发式合并
  6. wpf listview 滚动条宽度设置
  7. 基于三维GIS系统的管道管理应用
  8. 怎么把照片的四个角变成圆的?
  9. 【Salvation】——怪物角色动画主角碰撞死亡动画
  10. Camera对焦模式