当前位置: 首页 > news >正文

linux下串口通信相关知识

三种工作模式

当ICANON 标志被设置时表示启用终端的规范模式,默认情况为规范模式。

规范模式下,所有的输入是基于行进行处理的。在用户输入一个行结束符(回车符、EOF 等)之前,系统调用read()函数是读不到用户输入的任何字符的。除了EOF 之外的行结束符(回车符等)与普通字符一样会被read()函数读取到缓冲区中。在规范模式中,行编辑是可行的,而且一次read()调用最多只能读取一行数据。如果在read()函数中被请求读取的数据字节数小于当前行可读取的字节数,则read()函数只会读取被请求的字节数,剩下的字节下次再被读取。

非规范模式下,所有的输入是即时有效的,不需要用户另外输入行结束符,而且不可进行行编辑。在非规范模式下,对参数MIN(c_cc[VMIN])和TIME(c_cc[VTIME])的设置决定read()函数的调用方式。

上一小节给大家提到过,TIME 和MIN 的值只能用于非规范模式,两者结合起来可以控制对输入数据的读取方式。根据TIME 和MIN 的取值不同,会有以下4 种不同情况:

⚫ MIN = 0 和TIME = 0:在这种情况下,read()调用总是会立即返回。若有可读数据,则读取数据并返回被读取的字节数;否则读取不到任何数据并返回0。
⚫ MIN > 0 和TIME = 0:在这种情况下,read()函数会被阻塞,直到有MIN 个字符可以读取时才返回,返回值是读取的字符数量。到达文件尾时返回0。
⚫ MIN = 0 和TIME > 0:在这种情况下,只要有数据可读或者经过TIME 个十分之一秒的时间,read()函数则立即返回,返回值为被读取的字节数。如果超时并且未读到数据,则read()函数返回0。
⚫ MIN > 0 和TIME > 0:在这种情况下,当有MIN 个字节可读或者两个输入字符之间的时间间隔超过TIME 个十分之一秒时,read()函数才返回。因为在输入第一个字符后系统才会启动定时器,所以,在这种情况下,read()函数至少读取一个字节后才返回。

原始模式(Raw mode)
按照严格意义来讲,原始模式是一种特殊的非规范模式。在原始模式下,所有的输入数据以字节为单位被处理。在这个模式下,终端是不可回显的,并且禁用终端输入和输出字符的所有特殊处理。在我们的应用程序中,可以通过调用cfmakeraw()函数将终端设置为原始模式。

cfmakeraw()函数内部其实就是对struct termios 结构体进行了如下配置:

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;
1
2
3
4
5
6
什么时候会使用原始模式(传感器通信的时候)
串口在Linux 系统下是作为一种终端设备存在,终端通常会对用户的输入、输出数据进行相应的处理,如前所述。

但是串口并不仅仅只扮演着人机交互的角色(数据以字符的形式传输、也就数说传输的数据其实字符对应的ASCII 编码值);串口本就是一种数据串行传输接口,通过串口可以与其他设备或传感器进行数据传输、通信,譬如很多sensor 就使用了串口方式与主机端进行数据交互。那么在这种情况下,我们就得使用原始模式,意味着通过串口传输的数据不应进行任何特殊处理、不应将其解析成ASCII 字符。
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/zhuguanlin121/article/details/123291365

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 避免CSRF攻击的方案
  • 数据炼金术:用Python爬虫精炼信息
  • CSDN AI-WEB-1.0 攻略
  • C++基础语法:析构函数
  • 【现代操作系统】1. intro
  • Java中的主要设计模式
  • ubuntu18.04下安装nvidia3090显卡驱动
  • 数据结构----栈
  • C语言指针详解-上
  • (七)Activiti-modeler中文支持
  • 『Z-Workshop』 The Graph workshop mini hackathon活动
  • IBERT 眼图机制
  • 使用Poi-tl对word模板生成动态报告
  • 利用 Python 的包管理和动态属性获取(`__init__.py` 文件和 `getattr` 函数)特性来实现工厂方法模式
  • RHEL8 配置epel源
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 5、React组件事件详解
  • Android开源项目规范总结
  • DOM的那些事
  • Effective Java 笔记(一)
  • Elasticsearch 参考指南(升级前重新索引)
  • gitlab-ci配置详解(一)
  • leetcode386. Lexicographical Numbers
  • Linux后台研发超实用命令总结
  • Python 反序列化安全问题(二)
  • React组件设计模式(一)
  • Terraform入门 - 1. 安装Terraform
  • 关于Flux,Vuex,Redux的思考
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何进阶一名有竞争力的程序员?
  • 如何正确配置 Ubuntu 14.04 服务器?
  • Mac 上flink的安装与启动
  • ​iOS实时查看App运行日志
  • !!Dom4j 学习笔记
  • ### RabbitMQ五种工作模式:
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $.each()与$(selector).each()
  • (1)常见O(n^2)排序算法解析
  • (152)时序收敛--->(02)时序收敛二
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)测试工具
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .gitignore文件使用
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost