在 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. c++ try_catch throw
  2. android edittext设置内容为空,android – 我将EditText的InputType设置为TYPE_NULL后无法更改...
  3. 【1】C++面试题函数引用重载宏命名空间
  4. 量子计算机创新,中国式量子霸权:光子量子计算机研究创新纪-24小时-虎嗅网...
  5. java string范围_字符串索引超出范围? (Java,子字符串循环...
  6. 2015职称计算机考试模拟,2015职称计算机考试《Dreamweaver》模拟试题(9)
  7. matlab size11,matlab学习笔记11_3高维数组操作 filp, shiftdim, size, permute, ipermute
  8. 前端:用css打造炫酷3d特效- css3d立方体
  9. TFS2010物理迁移workspace恢复
  10. intouch的报警怎么发到邮件上
  11. ResourceBundle读取properties文件
  12. C# 标准ASCII 码表
  13. 两数之和——python
  14. php x63 157 162,浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解
  15. 数字化时代已经改变了我们的沟通方式
  16. AM5728设备数的描述
  17. 写任务,列清单-4D工作法
  18. 「工作流Activiti」介绍-新手上路,注意安全 - 第320篇
  19. linux条件语句awk,精通awk系列(18):awk流程控制之if、while、switch、for语句
  20. CodeForces 86C-Genetic engineering

热门文章

  1. [MySQL FAQ]系列 -- 数据不算大,备份却非常慢
  2. python 图表_使用Streamlit-Python将动画图表添加到仪表板
  3. 《20天吃透Pytorch》Pytorch自动微分机制学习
  4. leetcode1007. 行相等的最少多米诺旋转(贪心)
  5. Flutter VS React Native –为什么我认为Flutter最适合移动应用程序开发
  6. aws v2.2.exe_如何在AWS Elastic Beanstalk上部署Rails 5.2 PostgreSQL应用
  7. 图论:弦图最小点染色
  8. Redis服务器启动之后3个警告信息的解决方案
  9. 开源代码ViewPageIndicator的使用
  10. BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]