linux下串口通信相关知识

server/2024/10/16 2:30:49/

三种工作模式

当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


http://www.ppmy.cn/server/100942.html

相关文章

第十一章:图论part06 108.冗余连接 109.冗余连接II (补)

任务日期:7.31 题目一链接:108. 冗余连接 (kamacoder.com) 思路:从前到后遍历边,如果当前两个点不在一个集合就使他们加入到一个集合,构成树,如果位于一个集合则输出他们,因为如果把他们加入就…

【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED

开发环境搭建与点亮LED 文章目录 开发环境搭建与点亮LED1、STM32F103C8T6及STM32 Blue Pill 介绍2、下载并安装STM32CubeIDE3、编程并点亮LED3.1 在Stm32CubeIDE中编写第一个STM32程序3.1.1 创建项目3.1.2 设备配置3.1.2.1 系统时钟配置3.1.2.2 系统调试配置3.1.2.3 GPIO配置3.…

代码随想录算法训练营第 45 天 |LeetCode 115.不同的子序列 LeetCode583. 两个字符串的删除操作 LeetCode72. 编辑距离

代码随想录算法训练营 Day45 代码随想录算法训练营第 45 天 |LeetCode 115.不同的子序列 LeetCode583. 两个字符串的删除操作 LeetCode72. 编辑距离 目录 代码随想录算法训练营前言LeetCode 115.不同的子序列LeetCode583. 两个字符串的删除操作LeetCode72. 编辑距离 一、Leet…

Java填充PDF并返回填充后PDF文件及对应base64码

前期准备 下载PDF编辑工具(Adobe Acrobat 9 Pro): 可以主页关注小程序【白哥Java】回复【PDF编辑软件】即可获取 或者直接联系博主也可 主页如下: 软件使用流程 此处流程为文本域流程 图片或其他大致相同 生成模板PDF样式如下&…

Node.js、npm和ng之间的关系

一、Node.js 定义:Node.js是一个开源的、跨平台的JavaScript运行环境,它允许开发者在服务器端运行JavaScript代码。Node.js基于Chrome V8引擎,提供高性能和非阻塞I/O(输入输出)操作。功能:Node.js主要用于…

JSON与EXL文件互转

功能:实现json到excel文件的相互转换(支持json多选版) 目的:编码与语言对应,方便大家使用 页面设计: 介绍: 1.选择文件栏目选择想要转换的文件 2.生成路径是转换后文件所在目录 3.小方框勾选与不勾选分别代表exl到…

【C++11】右值引用的深度解析(什么是右值引用?它有什么作用?能应用在那些场景?)

目录 一、前言 二 、什么是左值什么是右值? 🔥左值🔥 🔥右值 🔥 三、什么是右值引用? 💧左右引用的“引出”💧 💧左值引用 💧 💧右值引用…

无人机里的陀螺仪/加速器/气压计/GPS详解

陀螺仪 是一种用于测量和控制无人机姿态的重要传感器。它通过检测无人机的旋转运动来提供准确的方向和角度信息。 加速度计 用于提供无人机在XYZ三轴方向所承受的加速力。它也能决定无人机在静止状态时的倾斜角度。 气压计 通过测量大气压力来估算无人机的高度。随着高度的…