嵌入式Linux 串口编程系列2--termios的VMIN和VTIME深入理解
在上一篇文章中,我们介绍了串口的一些基本知识、串口配置接口 termios结构体的概念,串口的配置参数有n多个,这里面不用都背下来,什么时候使用,翻看手册即可,但是有两个 参数是一定要理解的,就是VMIN和VTIME。上一篇文章中已经介绍了这两个概念,下面进一步解释:
VMIN:指定串口至少接收VMIN个字符,才会触发读完成。这个要这么理解,本质上,串口是逐bit逐byte接收的,也就是逐个节接收,不管是采用中断还是DMA,那么VMIN的引入,就要求 只有串口接收到VMIN个字节,才会认为接收完成,read函数才会停止阻塞。
VTIME:指定了读取的字符间隔超时时间,可以理解为串口接收的过程中会触发一个 定时器,这个定时器的溢出时间就是VTIME,但是要特别注意,每接收一个字节,就会重置这个定时器,直到最后一个字节接收完成,这个时候由于不会再重置定时器,所以再等VTIME时间后,定时器溢出,相当于接收完成,read函数停止阻塞。VTIME的单位是 十分之一秒,也就是100ms。
我们理解一个概念的最好方式是要想一想,这个概念的作用,为什么要这样设计?
上一篇我们介绍了串口的一些基本知识,实际的工程实践中,我们对串口的应用编程,最常见的情况就是 要处理串口接收不定长数据。这是通信的本质,因为通信的过程中,数据长度是经常要变的,我们使用串口不可能一直把tx和rx短接在一起。
那么如何解决 接收不定长数据呢? 在非linux的串口开发中,我们采用的方式一般是两种,一种是 结合定时器方式,一种是串口DMA空闲中断。
结合定时器的方式是这样的:串口接收到第一个字节后,触发定时器计时,每接收一个新的字节,重置定时器,这样能保证定时器不会溢出,等到接受完最后一个字节后,定时器就会 按照设计的计时时间来溢出,这个溢出时间就是VTIME,最终的效果就是,串口 接收数据完成,再等VTIME时间,定时器溢出中断,我们在中断服务 程序里就可以触发应用程序对接收数据的处理。
串口DMA空闲中断:这种方式需要结合DMA外围,一旦串口接收到第一个字节后,DMA就接手串口的功能,进行接收,等到接收完成后,此时串口处于空闲,就会触发空闲中断,我们就可以在串口中断服务函数中触发应用程序对接收数据进行处理,ps:串口空闲中断不是 串口一空闲就中断,而是串口 必须要先从“忙”再到“闲”才会触发 中断。
了解了上面的描述,我们回过头来看Unix/Linux环境下怎么去解决这个问题,答案是 操作系统已经提前想到了这些问题,帮我们提供了这个 功能,也就是设计的VTIEM和VMIN机制。我们如何通过这两个参数实现串口不定长数据接收呢?这里先说答案,就是把VMIN的值设置的足够大(不超范围),把VTIME设置的足够小(不能为0),具体如何编程呢,我们下一篇文章再来详细说明。《嵌入式Linux 串口编程系列3——通过VTIM、VMIN、select实现串口不定长数据接收功能》
嵌入式Linux 串口编程系列2--termios的VMIN和VTIME深入理解相关推荐
- 嵌入式Linux 串口编程系列3——通过VTIM、VMIN、select实现串口不定长数据接收功能
上一篇文章中,我们详细分析了VTIM和VMIN的功能, <嵌入式Linux 串口编程系列2--termios的VMIN和VTIME深入理解> 也明白了这两个参数设计的初衷和使用方法,接下来 ...
- 嵌入式Linux 串口编程系列1——基本知识、termios结构体
对于嵌入式系统开发而言,串口应用编程几乎是使用最 广泛的,应用案例如下: (1)串口与 外围设备通信,比如串口作为主设备,访问各种仪表从设备,协议一般有自有协议.Modbus通信协议. (2)开发的设 ...
- 嵌入式Linux 串口编程系列4——EasyARM287开发板通过freemodbus实现Modbus通信
前面的文章分析了串口的一些基本知识,在工业应用中,串口通信比较常用的协议就是Modbus RTU,freemodbus是一款微型modbus协议栈,之前对各种单片机.小型处理器支持的比较好,从V1.6 ...
- Linux 串口编程三 使用termios与API进行串口程序开发
在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解.事实上,快速掌握一项技术的核心点也是一种学习能力.对于使 ...
- Linux 串口编程二 深入了解 termios
前言 这一系列串口编程重点在应用层编程,但是在讲解原理与相关概念时需要对驱动框架有个基础的认识.如果只是浅尝辄止,以后在遇到串口驱动与应用层程序调试难免遇到瓶颈.关于 tty驱动架构参见我的其他博客: ...
- Linux 串口编程一 一些背景
在大部分讲解 Linux 编程书籍的时候会发现没有单独的串口编程章节,实际上串口编程已经被概括在了"终端"或者"终端IO"章节里面.在上一篇博客中对经常出现的几 ...
- Linux 串口编程四 串口设备程序开发
Linux 串口编程和程序相对来说是很简单的,之所以用博客连载来展示,主要是想在学会使用的基础上掌握相关背景,原理以及注意事项.相信在遇到问题的时候,我们就不会对于技术的概念和 API 的使用浅尝辄止 ...
- linux串口编程-termios结构
linux串口编程简单起来可以十分简单,但是复杂起来,也可以异常复杂.因为linux串口不仅仅是个串口,它跟终端联系起来.一般串口编程,绕不开的是struct termios结构体,其定义如下: #d ...
- Linux串口编程 —— 发送的数据无法被接收,且被原封不动返回
Linux串口编程--发送的数据无法被接收,且被原封不动返回 问题描述 使用 #include <fcntl.h> /*文件控制定义*/ #include <termios.h> ...
最新文章
- 凝聚406万开发者 飞桨十大发布提速产业智能化
- 未来属于人工智能工程师,但成功转型不容易
- 商汤科技汤晓鸥:其实不存在AI行业,唯一存在的是“AI+“行业
- SpringMVC无法获取请求中的参数的问题的调查与解决(1)
- the cdb terminated,Qt调试器问题
- 数据关系模式设计的标准化
- fedora15换主题
- pytorch中的切片时的省略号
- 低级键盘钩子 DLL
- oracle 删除空间不足,oracle表空间扩容、创建、删除(解决表空间不足问题)
- uC/OS 的任务调度解析
- 中国移动停售华为5G手机?双方回应...
- 我见过不少赚了钱,投资孵化一堆店铺的,一般而言后续发展都会出问题的
- 通过vmstat命令判断服务器瓶颈
- 第15周学习进度情况
- python前端开发工具篇
- 微信小程序发布全流程
- 数学建模解决出版社资源配置问题
- 基于多进程架构的嵌入式软件框架研究与实现
- 衡山湘大学计算机学校,南岳衡山烧香求学业显灵感恩南岳大庙祈福考上985双一流重点大学...
热门文章
- java注册登录小程序,详解小程序之简单登录注册表单验证
- ailx10的考研日记(节选)
- iphone5 一会有信号一会无服务器,苹果5手机为什么总是无服务,一会好了,一会又没服务了,为什么?...
- mysql 切割字符串 并用for循环_mysql完成字符串分割
- 烦恼的 Word 2003 遇到问题需要关闭...安全模式...
- 简易的setData一个数据
- 河北欧格教育:怎么布局更加吸引人
- BrainSpace—分析神经影像和连接体的大尺度梯度的工具箱
- js实现页面跳转并下载文件
- 【最新】LuaJIT 32/64 位字节码,从编译到使用全纪录