Linux VTIME VMIN的作用以及使用有效的前提

前提条件


 1、fdcom = open(ptty, O_RDWR | O_NOCTTY);

 //other attributions default
 /*Canonical Input*/
 //termios_new.c_lflag |= (ICANON | ECHO | ECHOE);
 2、/*Raw Input*/
 //termios_new.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

下面解释:
options.c_cc[VTIME] = 0; /* 设置超时0 seconds*/  

options.c_cc[VMIN] = 13; /* define the minimum bytes data to be readed*/


这两句话决定了对串口读取的函数read()的一些功能。我将着重介绍一下他们对read()函数的影响。

1、在数组c_cc中有两个下标(VTIME和VMIN)对应的元素不是控制符,并且只是在原始模式下有效。

      只有在原始模式下,他们决定了read()函数在什么时候返回。

2、在标准模式下,除非设置了O_NONBLOCK选项,否则只有当遇到文件结束符或各行的字符都已经编辑完毕后才返回。


 
解释一:
控制符VTIME和VMIN之间有着复杂的关系。

1、VTIME定义要求等待的零到几百毫秒的时间量(通常是一个8位的unsigned char变量,取值不能大于cc_t)。
2、VMIN定义了要求等待的最小字节数(不是要求读的字节数——read()的第三个参数才是指定要求读的最大字节数),这个字节数可能是0。

如果VTIME取0,VMIN定义了要求等待读取的最小字节数。函数read()只有在读取了VMIN个字节的数据或者收到一个信号的时候才返回。
如果VMIN取0,VTIME定义了即使没有数据可以读取,read()函数返回前也要等待几百毫秒的时间量。这时,read()函数不需要像其通常情况那样要遇到一个文件结束标志才返回0。
如果VTIME和VMIN都不取0,VTIME定义的是当接收到第一个字节的数据后开始计算等待的时间量。如果当调用read函数时可以得到数据,计时器马上开始计时。如果当调用read函数时还没有任何数据可读,则等接收到第一个字节的数据后,计时器开始计时。函数read可能会在读取到VMIN个字节的数据后返回,也可能在计时完毕后返回,这主要取决于哪个条件首先实现。不过函数至少会读取到一个字节的数据,因为计时器是在读取到第一个数据时开始计时的。
如果VTIME和VMIN都取0,即使读取不到任何数据,函数read也会立即返回。同时,返回值0表示read函数不需要等待文件结束标志就返回了。


解释二:

    VTIME指定了等待的时间,VMIN指定了读取字符的最小数量。


    它们不同组合地取值会得到不同的结果,分别如下:


    1.当VTIME>0,VMIN>0时。read调用将保持阻塞直到读取到第一个字符,读到了第一个字符之后开始计时,此后若时间到了VTIME或者时间未到但已读够了VMIN个字符则会返回;若在时间未到之前又读到了一个字符(但此时读到的总数仍不够VMIN)则计时重新开始。

    2. 当VTIME>0,VMIN=0时。read调用读到数据则立即返回,否则将为每个字符最多等待VTIME时间。

    3. 当VTIME=0,VMIN>0时。read调用一直阻塞,直到读到VMIN个字符后立即返回。

    4. 若在open或fcntl设置了O_NDELALY或O_NONBLOCK标志,read调用不会阻塞而是立即返回,那么VTIME和VMIN就没有意义,效果等同于与把VTIME和VMIN都设为了0。


解释三:

VTIME定义要求等待的时间量(取值不能大于cc_t)。


VMIN定义了要求等待的最小字节数。


options.c_cc[VTIME] = X;   //设置从获取到1个字节后开始计时的超时时间


options.c_cc[VMIN] = Y;     //设置要求等待的最小字节数


在原始模式下对read()函数的影响:


1、X=0,Y!=0。函数read()只有在读取了Y个字节的数据或者收到一个信号的时候才返回;


2、X!=0,Y=0。即使没有数据可以读取,read()函数等待X时间量后返回;


3、X!=0,Y!=0。第一个字节数据到时开始,最先满足收到Y个字节或达超时时间X任意一个条件,read()返回;


4、X=0,Y=0。即使读取不到任何数据,函数read也会立即返回。


示例:


通过串口连ID卡读卡器,要求读串口至少收6个字节数据立即返回,可以将串口的上述两个设置项设置如下:


options.c_cc[VTIME]=0;


options.c_cc[VMIN]=6;


下面再举例子说明:


VTIME 和  VMIN


VTIME  定义要求等待的零到几百毫秒的值(通常是一个8位的unsigned char变量)。
VMIN 定义了要求等待的最小字节数, 这个字节数可能是0。
只有设置为阻塞时这两个参数才有效,仅针对于读操作。
说起来比较复杂,举个例子吧,设置为阻塞状态,写操作未进行实验,这里仅讨论读操作,
read(fd,&buf,8); // 读串口


1、


options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 0;
VMIN = 0,当缓冲区字节数 >= 0 时进行读操作,实际上这时读串口操作并未被阻塞,因为条件始终被满足。


2、
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 1;
VMIN = 1,当缓冲区字节数 >= 1 时进行读操作,当没有数据时读串口操作被阻塞。


3、


options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 4;
VMIN = 4,当缓冲区字节数 >= 4 时进行读操作,否则读串口操作被阻塞。每次读出的最大字节数由read函数中第三个参数决定。直到缓冲区剩下的数据< read 第三个参数 并且< 4 (如果这时read第三参数为 1 则进行4次读操作直至读完缓冲区,如read第三参数为2,连续进行读操作,直至缓冲区空或还剩一个字符)。没有设置VTIME,剩下的字符没有确定的期限,直到下次满足读条件的时候才被读出。


----------------------------------考虑VTIME-----------------------------


4
options.c_cc[VTIME] = 10; //单位百毫秒
options.c_cc[VMIN] = 4;
同3的区别就是,没满足条件或读缓冲区中剩下的数据会在1秒(10百毫秒)后读出。另外特别注意的是当设置VTIME后,如果read第三个参数小于VMIN ,将会将VMIN 修改为read的第三个参数,即,使用read(fd,&buf,2);,以上设置变为:
options.c_cc[VTIME] = 10;
options.c_cc[VMIN] = 2;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php中使用httpclient

下载HttpClient.phphttp://yunpan.cn/QiD93DMb6vsEH &#xff08;提取码&#xff1a;ec47&#xff09; 下载之后&#xff0c;将该文件放到项目文件目录下新建class目录下 然后在php中使用: 1 <?php2 require_once class/HttpClient.php;3 $params array(4 coords>114.3…

Hi3520d uboot uImage rootfs 移植与升级

安装、升级hi3520DDEMO板开发开发环境 # 如果您使用的hi3520D的DEMO板&#xff0c;可以按照以下步骤烧写u-boot&#xff0c;内核以及文件系统&#xff0c;以下步骤均使用网络来更新。 # 通常&#xff0c;您拿到的单板中已经有u-boot&#xff0c;如果没有的话&#xff0…

面向切面编程(转)

面向切面编程&#xff08;AOP是Aspect Oriented Program的首字母缩写&#xff09; &#xff0c;我们知道&#xff0c;面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去&#xff0c;这在软件设计中往往称为职责分配。实际上也就是说&#xff0c;让不同…

Hi3520d uImage制作 uboot制作 rootfs制作

首次安装SDK 1、hi3520D SDK包位置 在"hi3520D_V100R001***/01.software/board"目录下&#xff0c;您可以看到一个 hi3520D_SDK_Vx.x.x.x.tgz 的文件&#xff0c; 该文件就是hi3520D的软件开发包。 2、解压缩SDK包 在linux服务器上&#xff08;或者一台装有…

[LeetCode Online Judge]系列-求二维平面内在一条直线上的最大点数

2019独角兽企业重金招聘Python工程师标准>>> Max Points on a Line Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. 题目是:在2D平面内给N个点,求最多多少个点在一个直线上. 以下是AC的解决方式: /*** Defi…

Hi3520D UART2和UART3是如何加载到内核的

Hi3520D的UART驱动位于linux-3.0.y/drivers/tty/serial/amba-pl011.c 添加UART2和UART3需要修改的文件为&#xff1a;linux-3.0.y/arch/arm/mach-hi3520d/core.c和linux-3.0.y/arch/arm/mach-hi3520d/include/mach/irqs.h两个文件&#xff1b; 首先修改 core.c文件&#xff0c;…

Linux-C实现GPRS模块发送短信

“GSM模块&#xff0c;是将GSM射频芯片、基带处理芯片、存储器、功放器件等集成在一块线路板上&#xff0c;具有独立的操作系统、GSM射频处理、基带处理并提供标准接口的功能模块。GSM模块根据其提供的数据传输速率又可以分为GPRS模块、EDGE模块和纯短信模块。短信模块只支持语…

【思科】GNS3模拟静态NAT/动态NAT

实验拓扑&#xff1a;实验目的&#xff1a;利用NAT技术&#xff0c;使C1,C2能与R2连通。实验步骤&#xff1a;如图配置好IP地址&#xff0c;为C1,C2指定网关192.168.1.1。2.在R1上配置静态NAT.假定为C1配置公网地址12.0.0.3&#xff0c;来实现与R2的连通。这样&#xff0c;静态…

Text模式和PDU模式的区别

发送短消息常用Text和PDU(Protocol Data Unit&#xff0c;协议数据单元)模式。使用Text模式收发短信代码简单&#xff0c;实现起来十分容易&#xff0c;但最大的缺点是不能收发中文短信&#xff1b;而PDU模式不仅支持中文短信&#xff0c;也能发送英文短信。PDU模式收发短信…

[家里蹲大学数学杂志]第041期中山大学数计学院 2008 级数学与应用数学专业《泛函分析》期末考试试题 A...

1 ( 10 分 ) 设 $\mathcal{X}$ 是 Banach 空间, $f$ 是 $\mathcal{X}$ 上的线性泛函. 求证: $f\in \mathcal{L}(\mathcal{X})$ 的充分必要条件是 \[ N(f)\{ x\in \mathcal{X};\ f(x)0 \} \] 是 $\mathcal{X}$ 的闭线性子空间. 证明: 必要性. 设 $N(f)\ni x_n\to x$, 则 $$\bex …

PUD编码规则

共有三种方式来发送和接收SMS信息&#xff1a;Block Mode, Text Mode和PDU Mode。其中PDU Mode被所有手机支持&#xff0c;可以使用任何字符集&#xff0c;这也是手机默认的编码方式。 发送短消息常用Text和PDU(Protocol Data Unit&#xff0c;协议数据单元)模式。使用Text模式…

xml 解析

2019独角兽企业重金招聘Python工程师标准>>> 各大数据接口大全&#xff1a;http://blog.sina.com.cn/s/articlelist_2127818045_10_1.html package com.test.junit; import static org.junit.Assert.*; import java.io.ByteArrayInputStream;import java.io.InputSt…

3.1 采购管理规划

3.1.1 采购业务管理规划 通过企业采购业务管理规划&#xff0c;从而引入完全价值采购体系&#xff0c;建立企业的战略性采购或电子化采购流程&#xff0c;进行合同管理&#xff0c;收货管理和使用&#xff0c;采购结算&#xff0c;降低总体采购成本&#xff1b; 整合企业的采…

能吹是多么的重要

联合利华引进了一条香皂包装生产线&#xff0c;结果发现这条生产线有个缺陷&#xff1a;常常会有盒子里没装入香皂。总不能把空盒子卖给顾客啊&#xff0c;他们只得请了一个学自动化的博士后设计一个方案来分拣空的香皂盒。博士后拉起了一个十几人的科研攻关小组&#xff0c;综…

深入理解Linux守护进程

深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务&#xff0c;它们向本地和网络用户提供了Linux的系统功能接口&#xff0c;直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程&#xff08;daemons&#xff09;来执行的。守护进程是生存期长的…

【翻译】Ext JS 4——Ajax和Rest代理处理服务器端一场和消息的方法

原文&#xff1a;EXTJS4 - Handle Server-side exceptions and message from an Ajax or Rest proxy作者&#xff1a;Raja可能要处理的情况&#xff1a;success&#xff08;成功&#xff09;——Ext处理failure&#xff08;失败&#xff09;&#xff0c;由于通讯问题——Ext处理…

Apache下PHP Loaded Configuration File None 解决方法

解决方法可在apache配置文件中增加 PHPIniDir “The path to your php.ini”&#xff0c; 比如&#xff1a;PHPIniDir "/usr/local/php/etc/php.ini"重启apache。 确保PHPIniDir在loadModule php5_module之前 转载于:https://blog.51cto.com/zrer90/1421464

理解Lucene/Solr的缓存

缓存对于提高搜索引擎的吞吐量&#xff0c;降低CPU占用率极为重要。Lucene/Solr在这块做了很多的工作。Lucene/Solr中默认提供了5种缓存&#xff0c;同时solr还提供扩展缓存接口&#xff0c;允许开发者自定义缓存。1 缓存的基本原理Solr实现了两种策略的缓存&#xff1a;LRU(Le…

深入了解tcmalloc(一):windows环境下无缝拦截技术初探

2019独角兽企业重金招聘Python工程师标准>>> 概述&#xff1a; 又到了一个总结提炼的阶段&#xff0c;这次想具体聊聊游戏引擎中使用的内存管理模块tcmalloc组件的使用心得。项目的前期曾经遇到过内存瓶颈&#xff0c;特别是windows系统下的客户端程序在经历长时间运…

删除数据库日志文件的方法

原文:删除数据库日志文件的方法你曾经有在执行SQL的时候&#xff0c;数据库报事务日志已满&#xff0c;然后执行报错。然后纠结于怎么删除数据库日志&#xff0c;捣鼓半天吗&#xff0c;现在就提供两种删除日志文件的方法&#xff0c;希望能够帮到你&#xff01; 阅读目录 方法…