在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解。事实上,快速掌握一项技术的核心点也是一种学习能力。对于使用,熟悉并掌握操作框架十分有用。对于串口编程,核心步骤也十分鲜明,下面首先介绍 termios 相关的 API 函数。

核心配置函数

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

函数功能:获取当前终端接口配置并将配置写入参数 termios_p 指向的 termios 结构体。一般操作时将配置保存为 old_termios,可以在需要时通过 tcsetattr 函数对终端接口进行重新配置。

2. int tcsetattr(int fd, int actions, const struct termios *termios_p);

函数功能:使用 termios_p 指向的 termios 结构体对终端接口进行配置,参数 actions 控制修改方式,共有3种修改方式,如下所示:

  • TCSANOW:立刻对配置进行修改。
  • TCSADRAIN:等当前输出完成后再对配置进行修改。
  • TCSAFLUSH:等当前输出完成后再对配置进行修改,但丢弃还未从 read 调用返回的当前可用的任何输入。
Note:如果需要在程序操作结束恢复终端或者串口的初始状态,那么就需要使用 tcgetattr 介绍中的操作步骤进行恢复。

终端速度函数

1.speed_t cfgetispeed(const struct termios *);

函数功能:获取终端读取速度。

2.speed_t cfgetospeed(const struct termios *);

函数功能:获取终端输出速度。

3.int cfsetispeed(const struct termios *, speed_t speed);

函数功能:设置终端读取速度。

4.int cfgetispeed(const struct termios *, speed_t speed);

函数功能:设置终端输出速度。

Note:输入与输出速度是分开控制的;根据函数形参,这些函数只作用于 termios 结构,而不是直接作用于设备。因此如果要设置速度,就要首先使用 tcgetattr 获取当前终端配置,然后使用上述函数设置速度,最后使用 tcsetattr 将 termios 配置写入设备。此外,还要注意系统支持的波特率范围,通过查看 termios.h 可以获取到。

其他控制函数

1.int tcdrain(int fd);

函数功能:让调用程序一直等待,直到所有排队的输出都已发送完毕。

2.int tcflow(int fd, int flowtype);

函数功能:用于暂停或重新开始输出。

3.int tcflush(int fd, int in_out_selector);

函数功能:用于清空输入、输出或者两者同时清空。

Note:如果串口程序发生阻塞,检查程序中是否调用了上述 API。在打开终端或者串口设备之前,对应的输入或者待输出数据缓存在驱动程序中,因此要根据实际需求选择是否调用 tcflush 清空相应缓冲区数据。

关于终端串口 API 函数的讲解本篇就到这里,在实际应用开发中必须明确程序中配置的标志位和函数的作用,在不确定作用的情况下最好保持默认设置。

关于 Linux 串口编程的其他文章,可以移步至以下链接:

  1. 《Linux 串口编程<一> 一些背景》
  2. 《Linux 串口编程<二> 深入了解 termios》
  3. 《Linux 串口编程<三> 使用termios与API 进行串口程序开发》
  4. 《Linux 串口编程<四> 串口设备程序开发》

有想法或者疑问可以给我邮件或者评论,觉得本文对你有帮助就点赞吧~:-D

Linux 串口编程三 使用termios与API进行串口程序开发相关推荐

  1. 串口编程之三:VMware虚拟机下的串口调试

    Windows为宿主机,VMware虚拟机中安装了 Linux,也可以在 Linux 下编写程序对串口发送消息.原理同样是利用虚拟串口软件VSPM 将COM3与COM4连接后通过串口调试器捕获.下面会 ...

  2. Linux网络编程:用C语言实现的聊天程序(同步通信)

    通过TCP协议,用C语言实现的同步聊天程序,注释写的比较详细,个人觉得对字符串处理比较充分,能够正常编译运行,拿出来和大家分享一下! 1.客户端源代码: [cpp] view plaincopypri ...

  3. Linux网络编程篇之ICMP协议分析及ping程序实现

    Linux网络编程系列: Linux网络编程篇之Socket编程预备知识 Linux网络编程篇之TCP协议分析及聊天室功能实现 如果对Linux网络编程,对socket通信不是太清楚的同学,强烈推荐看 ...

  4. 教孩子学编程python语言pdf_iOS(iPhone)应用程序开发入门视频教程(35讲)

    资源名称:iOS(iPhone)应用程序开发入门视频教程(35讲) 资源目录: [IT教程网]ios(iPhone)应用程序开发入门视频教程:第10讲多视图应用程序 [IT教程网]ios(iPhone ...

  5. Linux系统编程(三) --进程间通信

    文章目录 1 进程间通信总览 1.1 进程间如何通信 1.2 Linux IPC 分类 1.3 Linux IPC常用手段 2 无名管道 2.1 pipe 函数 2.2 用pipe进行进程间通信 3 ...

  6. Linux系统编程三:使用man查看帮助文档

    目录 一.概述 二.使用方法 三.手册分页 四.总结 一.概述 在前两篇延时时间和LED控制中,都用到了系统函数.随着学习深入,用到的函数越来越多,如何记住每个函数的原型和头文件?一些常用的函数随着印 ...

  7. linux shell编程(三) if 和 for

    if 条件判断: 单分支的if语句 if 判断条件: then statement1 fi 双分支的if语句 if 判断条件;then statement1 statement else statem ...

  8. Linux Shell编程三

    case分支条件语句. case "string" in pattern_1)commands ;; pattern_2)commands ;; *)commands ;; esa ...

  9. python3.6串口编程实例_使用python3实现操作串口详解

    通过引用serial模块包,来操作串口. 1.查看串口名称 在Linux和Windows中,串口的名字规则不太一样. 需要事先查看. Linux下的查看串口命令 root@D2:~# ls -l /d ...

最新文章

  1. 【CV】Numpy|Python中矩阵和数组乘法及向量相关问题
  2. 两个晶体管组成的混沌电路
  3. windows7环境下的http-server的问题 排查
  4. 每次执行java命令 都要source_解决每次执行Java等命令时都要重新source /etc/profile后才能执行,否则找不到命令...
  5. MFC Radio Button 使用 分组 RadioButton 用法
  6. C++ 中export 关键字的尴尬处境
  7. 计组之数据运算:13、加法器优化
  8. 九宫格图片上传可展示,可删除,可添加功能
  9. 基于新标注模式的实体和关系联合抽取方法(Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme)
  10. ubuntu 定时执行重启(crontab)
  11. 机器人学导论——操作臂运动学
  12. 一篇文章教会你用Python抓取抖音App热点数据
  13. 四川大学计算机学院彭德中,四川省计算机学会
  14. bootstrap~去除input选中时的蓝色边框线
  15. 2019年:两成开发者月薪超1.7万,算法工程师最紧缺
  16. 告警流量分析:Cobalt Strike(默认实验文)
  17. python初步学习(二) 3.19
  18. 【阅读】Variational Adversarial Active Learning
  19. 16.节点通信-flannel
  20. Java毕设项目高校体育场馆预约管理系统设计与实现(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. 芒果云接吗_芒果糯米饭是生产力的关键吗?
  2. 数据科学学习心得_学习数据科学时如何保持动力
  3. leetcode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
  4. leetcode744. 寻找比目标字母大的最小字母(二分查找)
  5. leetcode979. 在二叉树中分配硬币(dfs)
  6. 引用自己创建的css样式表_如何使用CSS创建联系表
  7. 现代JavaScript中的精美图案:制冰厂
  8. 消解原理推理_什么是推理统计中的Z检验及其工作原理?
  9. [51Nod 1218] 最长递增子序列 V2 (LIS)
  10. 基于相关性分析系统性能瓶颈