串口VMIN VTIME 详解

以前跟着做过VxWorks的开发,主要通信方式是串口,因为底层BSP包已经做好了,串口通信非常简单。后来接触Linux,在一块OK6410上跑Linux串口通信,才发现原来天真的以为甚是简单的串口变得如此的不简单。

#include <termios.h>

1、串口的操作

1.1打开:fd = open("/dev/ttySAC1", O_RDWR | O_NOCTTY | O_NDELAY);
              O_RDWR 读写方式打开;
              O_NOCTTY 不允许进程管理串口(不太理解,一般都选上);
              O_NDELAY 非阻塞(默认为阻塞,打开后也可以使用fcntl()重新设置)

1.2写入:n = write(fd, "linux", 5);
                n实际写入字节数;

1.3读取:res = read(fd,buf,len);
                 res 读取的字节数;

1.4设置:fcntl(fd, F_SETFL, FNDELAY); //非阻塞
                 fcntl(fd, F_SETFL, 0); // 阻塞

1.5关闭:close(fd);

2、串口配置

struct termios options;  // 串口配置结构体
tcgetattr(fd,&options); //获取当前设置
bzero(&options,sizeof(options));
options.c_cflag  |= B115200 | CLOCAL | CREAD; // 设置波特率,本地连接,接收使能
options.c_cflag &= ~CSIZE; //屏蔽数据位
options.c_cflag  |= CS8; // 数据位为 8 ,CS7 for 7 
options.c_cflag &= ~CSTOPB; // 一位停止位, 两位停止为 |= CSTOPB
options.c_cflag &= ~PARENB; // 无校验
 //options.c_cflag |= PARENB; //有校验
//options.c_cflag &= ~PARODD // 偶校验
//options.c_cflag |=  PARODD    // 奇校验
options.c_cc[VTIME] = 0; // 等待时间,单位百毫秒 (读)。后有详细说明
options.c_cc[VMIN] = 0; // 最小字节数 (读)。后有详细说明
tcflush(fd, TCIOFLUSH); // TCIFLUSH刷清输入队列。
                                       TCOFLUSH刷清输出队列。 
                                       TCIOFLUSH刷清输入、输出队列。
tcsetattr(fd, TCSANOW, &options); // TCSANOW立即生效;
                                                        TCSADRAIN:Wait until everything has been transmitted;
                                                        TCSAFLUSH:Flush input and output buffers and make the change

3、VTIME 和  VMIN

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

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

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

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

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

3.4
options.c_cc[VTIME] = 10; //单位百毫秒
options.c_cc[VMIN] = 4;
同3.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/403918.shtml

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

相关文章

cocos2dx 3.0 windows平台 中文乱码解决

From: http://www.cnblogs.com/yujiaao/p/3691938.html 因为linux下cocostudio wine安装不上 而且又要开发windows程序 果断舍弃了ubuntu而实用vs2013 去玩cocos2dx3.0 花了一天的时间才解决中文乱码 泪奔ing 分享记录下 下面是我尝试的的过程&#xff1a; 1相关设置 右键项…

liux 常用操作命令

tail -f /home/jyapp/apache-tomcat-7.0.59/logs/catalina.out //查看实施日志 //删除临时目录并且启动服务器 rm -rf /home/jyapp/apache-tomcat-7.0.59/work/* & rm -rf /home/jyapp/apache-tomcat-7.0.59/temp/* &/home/jyapp/apache-tomcat-7.0.59/bin/startup.sh…

SecureCRTSecureFX_HH_x64_7.0.0.326 crt部署项目到服务器

1.使用crt 2.输入服务器ip和账号 3.命令 cd 空格 /item/qd 回车进入到规定好的前端代码目录下 ls 查看目录下的文件 4.rm -rf 文件名称/或者目录名称&#xff08;空格删除多个、&#xff09; rm 空格 -rf 空格 *.zip 删除所有的zip rz 上传新的zip包 6。解压 unzip 空…

ant中的table和pagination表格分页结合使用 手写分页

表格部分 <a-table:row-selection"rowSelection" :columns"columns":data-source"data"class"components-table-demo-nested"change"onChangeTable":scroll"{ x:1600 ,y:500}":pagination"pagination&qu…

poj3692

最大独立集&#xff0c;把不认识的男女看成是有矛盾的&#xff0c;要选出一些互相没有矛盾的男女。 View Code #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std;#define maxn 205bool g[maxn][max…

NFS调试linux内核启动卡死在DHCP和RARP上

手头有两块板子。第一块有两个网卡phy&#xff0c;第二块一个网卡phy。为了驱动的统一使用&#xff0c;在内核中都配置如下 Device Drivers ---> [*] Network device support ---><*>Dummy net driver support <*> Nuvoton NUC970 Ethernet MAC 0 <*>…

在项目里交叉使用Swift和OC

From: http://blog.csdn.net/huangchentao/article/details/35278663 Swift and Objective-C in the Same Project 在项目里交叉使用Swift和OC Swift与OC的兼容性使得你可以在项目里使用SwiftOC的方式编写应用程序&#xff0c;称为混合匹配(mix and match)&#xff0c;用这种…

IE请求json数据时出现下载文件的现象。

当使用IE浏览器请求服务器时&#xff0c;会出现下载json文件的现象&#xff0c;就需要在spring-MVC.xml文件里配置&#xff1a; <bean class"org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" id"mappingJacksonHttpMessageCon…

Linux下查看TOMCAT控制台

Linux下查看TOMCAT控制台 $ ./catalina.sh run 就可以了。 debug模式&#xff1a; $ ./catalina.sh debug ...... help (查看帮助) exit&#xff08;退出、终止tomcat&#xff09; catalina.sh [para] para: debug start Catalina in a d…

Nandflash希尔特编程器烧录带来的一些点知识信息

1&#xff0e;NAND FLASH的特殊性 1)存在坏块。NAND FLASH由于其生产工艺的原因&#xff0c;出厂芯片中会随机包含坏块。坏块在出厂时已经被初始化&#xff0c;并在特定区域中存在标记&#xff0c;如果在使用过程中出现坏块&#xff0c;也需要进行标记。2)易出现位反转。NAND F…

WireShark抓包,may be caused by ip checksum offload的解决办法

From: http://blog.csdn.net/yanjiee/article/details/8051494 今天在用WireShark抓包的时候&#xff0c;发现由本机发出去的包都是黑底红字&#xff0c;点进去看了一下发现都是报“may be caused by ip checksum offload”这样一个错误。 于是在网络上搜了一下关于Checksum o…

使用Dezender对zend加密后的php文件进行解密

在开发中需要修改一些php文件&#xff0c;部分是通过zend加密的&#xff0c;记事本打开之后是这样的&#xff1a; 此时需要使用Dezender进行解密&#xff0c;下载链接如下&#xff1a; Dezender.7z 下载后解压到C盘(路径不要带有中文)&#xff0c;如解压到其他位置&#xff0c;…

vue cli3 兼容ie8以上浏览器,前端兼容;解决ie浏览器下白屏问题

1下载 babel-polyfill 模块 npm install babel-polyfill -s2入口文件&#xff08;main.js&#xff09;第一行引入 import "babel-polyfill"; import Vue from vue import App from ./App.vue import router from ./router import store from ./store import Button…

project下查看那些文件夹是空的

git不能追踪空文件夹。我们在空文件夹下添加readme.txt文件来解决。有时候我们不知道project下到底有那些文件夹是空的。使用 find -type d -empty 就能列出来。

Ubuntu 12.04 安装设置gcc4.4

在Ubuntu 12.04中的默认的GCC版本是4.6。但是这个版本在编译android 4.0源码的时候会出差&#xff0c;下面是安装和设置GCC4.4的方法。 下文来自网络&#xff1a;http://mjanja.co.ke/2012/04/ubuntu-gcc-4-4-considered-harmful/ I’ve been having some problems with Ubuntu…

ffmpeg在windows下的编译

From: http://blog.csdn.net/kidleaf2/article/details/7925283 1、 下载编译环境MinGWMsys&#xff0c;地址是&#xff1a;http://sourceforge.net/projects/mingwbundle/files/&#xff0c;在这个页面上点击Download下载那个zip文件。下载完成后&#xff0c;直接安装&#…

在maven中开发Spring需要的jar依赖

在maven中开发Spring需要的jar依赖 <properties><spring.version>4.0.6.RELEASE</spring.version> </properties> spring jar <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId>…

vue-cli3引入第三方的js依赖包并使用其方法

注意&#xff1a;引入第三方的包有两种&#xff0c;一种是做特殊要求必须如何引用的&#xff1b;一种是没有要求的 情况1&#xff1a;js包要求了如何引入的&#xff0c;按照其文档的方式引入和使用即可 1.1直接在indes.html按照要求引入 1.2使用方法 情况2&#xff1a;没…

autoconf.mk详析

uboot的顶层Makefile中有如下的一段代码[plain] view plaincopy # # Auto-generate the autoconf.mk file (which is included by all makefiles) # # This target actually generates 2 files; autoconf.mk and autoconf.mk.dep. # the dep file is only include in this …

trigger

trigger() 方法触发被选元素的指定事件 <html><head><script type"text/javascript" src"/jquery/jquery.js"></script><script type"text/javascript">$(document).ready(function(){ $("input").sele…