以前跟着做过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;

串口VMIN VTIME 详解相关推荐

  1. 陶晶驰stm32_陶晶驰HMI3.5寸串口屏的详解之梳理F4总结系列准备篇(二)

    基于stm32的串口屏教程.用过的人都说好,哈哈哈,减少了我们很多不太必要的麻烦步骤. 程序资料包CSDN下载地址:https://download.csdn.net/download/qq_3835 ...

  2. ws2812b程序51单片机_51单片机串口通信程序详解

    串口通信简介 串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串行接口电路 ...

  3. 串口接收模块uart_rx详解

    接收模块要比发送模块稍微复杂一丢丢,但有助于锻炼自己对于时序模块的逻辑性的掌握能力. 本文是学习了小梅哥的串口接收模块教程的总结整理. 1. 原理介绍 详见<串口发送模块uart_tx详解> ...

  4. C# 串口SerialPort方法详解

    C#串口方法详解 创建SerialPort对象 初始化参数串口号portName 初始化参数波特率baudRate 初始化参数奇偶校验位baudRate 初始化参数数据位dataBits 初始化参数停 ...

  5. 单片机_串口通信知识详解

    单片机_串口通信详解      楼主在实际的项目开发过程中,特别是用一些比较常见的传感器,使用最多的通信方式可能就是串口通信了,特别是UART(通用异步收发器),线少,虽然传输速度没有并行传输高,但是 ...

  6. 串口及串口通信硬件详解UART,I2C,SPI,USB

    1.计算机与计算机或计算机与终端之间的数据传送串行通讯和并行通讯二种方式 1.1.串行通信 和 并行通信 并行通讯通常可以一次传送8bit.16bit.32bit甚至更高的位数,相应地就需要8根.16 ...

  7. linux 串口 vmin vtime ,Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用

    在串口编程模式下,open未设置O_NONBLOCK或O_NDELAY的情况下. c_cc[VTIME]和c_cc[VMIN]映像read函数的返回. VTIME定义等待的时间,单位是百毫秒(通常是一 ...

  8. OPENWRT串口收发测试详解

    最近刚刚开始接触Linux内核编程,第一项就是串口编程,结果卡在这里了,卡了好久,后来发现问题其实挺简单的,只是没有想到,现在把代码放在下面,代码内有详细的注释,就不多做说明了,而我当时出问题的地方我 ...

  9. 【STM32学习笔记】(9)——串口通讯(USART)详解

    本文主要参考了野火的零死角玩转STM32和正点原子的STM32F1 开发指南 V1.1(精英板-库函数版本),文章中大部分知识都是从两本书中提取出来,串口通信协议的知识主要参考野火的书籍,而串口实验部 ...

最新文章

  1. 从粒子到宇宙的旅行指南
  2. DM368开发 -- uboot 使用
  3. 牛客题霸 [斐波那契数列] C++题解/答
  4. 散分,并如何判断时间段上有重叠冲突。
  5. 5848. 树上的操作
  6. 知新 | koa框架入门到熟练第二章
  7. Android单元测试 - Sqlite、SharedPreference、Assets、文件操作 怎么测?
  8. struts1基础入门
  9. android sdk httppost,android6.0SDK 删除HttpClient的相关类的解决方法
  10. 爆牙齿的世界杯日记(忆)。
  11. R中安装LightGBM(Windows 64位)
  12. JNI在C和C++的env语法
  13. ESP8266与网络调试助手通讯
  14. HDU 2825 AC自动机+状压dp
  15. php不能撤销,word无法撤销怎么解决
  16. 笔记本win7共享WIFI
  17. mtk 6577 root
  18. python实现指纹识别毕业论文_指纹识别系统设计毕业论文+开题报告+翻译及原文+设计源码...
  19. Solidworks绘制齿轮过程备注
  20. icc校色文件使用教程_Windows7色彩管理显示器ICC设置方法

热门文章

  1. 真实感图形生成:太阳系
  2. MDT 评测 — 一加 7 Pro 屏幕素质报告
  3. Delphi2010开发的图文转换工具
  4. 2020年2月19日绝地求生服务器维护,绝地求生更新维护到几点今天 2月19日停机更新维护公告...
  5. DOS批处理+ftp自动同步文件
  6. 第五代计算机为何在“智能化”阶段的发展像蜗牛般的徘徊前行?
  7. luffy-15/区间过滤,搜索功能前端后端,支付宝
  8. 不就是个短信验证嘛,还真挺复杂的
  9. STM32F103驱动GY-30(BH1750)光照强度传感器程序讲解(附加程序下载)
  10. vim编辑只读文件无法保存问题