Linux串口编程的阻塞与否可以在open函数中设置,例如:

打开时使用:
fd = open(USAR1, O_RDWR | O_NOCTTY );//阻塞式读写fd = open("/dev/ttyAT2",O_RDWR|O_NOCTTY|O_NDELAY);   //非阻塞读写

除了用open函数之外还可以在open函数之后用fcntl函数来设置,代码如下:

打开后使用fcntl函数修改:
fcntl(fd, F_SETFL, 0); //设为阻塞,即使前面在open串口设备时设置的是非阻塞的,这里设为阻塞后,以此为准
fcntl(fd,F_SETFL,FNDELAY)//设为非阻塞,道理同上

阻塞式读写可设置以下两参数:

opt.c_cc[VMIN] = vmin;   //设置非规范模式下的超时时长和最小字符数:阻塞模式起作用
opt.c_cc[VTIME] = vtime; //VTIME与VMIN配合使用,是指限定的传输或等待的最长时间

若 VMIN = 0 ,VTIME = 0  ,函数read未读到任何参数也立即返回,相当于非阻塞模式;

若 VMIN = 0,   VTIME > 0  ,函数read读取到数据立即返回,若无数据则等待VTIME时间返回;

若 VMIN > 0,   VTIME = 0  ,函数read()只有在读取到VMIN个字节的数据或者收到一个信号的时候才返回;

若 VMIN > 0,   VTIME > 0  ,从read读取第一个字节的数据时开始计时,并会在读取到VMIN个字节或者VTIME时间后返回。

例如,我在open函数设置为阻塞,并规定要接收到10字节后才返回read函数,设置代码如下:

int fd_uart;
char *uart3 = "/dev/ttySAC3";if((fd_uart = open(uart3, O_RDWR|O_NOCTTY))<0)printf("open %s is failed",uart3);else{set_opt(fd_uart, 115200, 8, 'N', 1);}int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{struct termios newtio,oldtio;//读出原来的配置信息,按理说之所以读出来,是有部分数据不需要改,但感觉这里是这里对新的结构体配置,也没用到读出来的值if  ( tcgetattr( fd,&oldtio)  !=  0) {    perror("SetupSerial 1");return -1;}bzero( &newtio, sizeof( newtio ) );        //新结构体清0newtio.c_cflag  |=  CLOCAL | CREAD;newtio.c_cflag &= ~CSIZE;switch( nBits ){case 7:newtio.c_cflag |= CS7;break;case 8:newtio.c_cflag |= CS8;break;}/***     奇偶校验        ***/switch( nEvent ){case 'O':newtio.c_cflag |= PARENB;newtio.c_cflag |= PARODD;newtio.c_iflag |= (INPCK | ISTRIP);break;case 'E': newtio.c_iflag |= (INPCK | ISTRIP);newtio.c_cflag |= PARENB;newtio.c_cflag &= ~PARODD;break;case 'N':  newtio.c_cflag &= ~PARENB;break;}/***        设置波特率       ***/switch( nSpeed ){case 2400:cfsetispeed(&newtio, B2400);cfsetospeed(&newtio, B2400);break;case 4800:cfsetispeed(&newtio, B4800);cfsetospeed(&newtio, B4800);break;case 9600:cfsetispeed(&newtio, B9600);cfsetospeed(&newtio, B9600);break;case 115200:cfsetispeed(&newtio, B115200);cfsetospeed(&newtio, B115200);break;case 460800:cfsetispeed(&newtio, B460800);cfsetospeed(&newtio, B460800);break;default:cfsetispeed(&newtio, B9600);cfsetospeed(&newtio, B9600);break;}/***        设置停止位       ***/if( nStop == 1 )newtio.c_cflag &=  ~CSTOPB;else if ( nStop == 2 )newtio.c_cflag |=  CSTOPB;/*设置等待时间和最小接收字符*/newtio.c_cc[VTIME]  = 0;newtio.c_cc[VMIN] = 10;         //设置阻塞的最小字节数,阻塞条件下有效/*处理未接收字符*/ tcflush(fd,TCIFLUSH);/*激活新配置*/if((tcsetattr(fd,TCSANOW,&newtio))!=0){perror("com set error");return -1;}//    printf("set done!\n\r");return 0;
}

参考文章:

https://blog.csdn.net/m0_38096844/article/details/90716182

https://blog.csdn.net/wuhengwudi/article/details/7454629

Linux串口阻塞与非阻塞相关推荐

  1. Linux 使用fcntl c_cc[VMIN] c_cc[CTIME]设置串口阻塞与非阻塞读取数据

    一.概述 Linux串口非常灵活,可以根据需要配置成标准串口和自定义串口模式,就Linux 串口读取数据来说,有有两种主要方式:阻塞与非阻塞. 阻塞:一直等待数据,直到退出条件成立: 非阻塞:及时返回 ...

  2. linux非阻塞输入函数,Linux fcntl函数设置阻塞与非阻塞

    转自http://www.cnblogs.com/xuyh/p/3273082.html 用命令F_GETFL和F_SETFL设置文件标志,比如阻塞与非阻塞 F_SETFL     设置给arg描述符 ...

  3. linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O

    今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式. 一.基本概念: 阻塞操作 ...

  4. Linux驱动(六)设备驱动中的阻塞与非阻塞IO

    我们在Linux学习(二十三)IO模型中了解了LINUX中IO模型,IO模型最简单的可以分为阻塞IO和非阻塞IO.并且学习了一个用如何使用阻塞操作和非阻塞操作.而应用层之所以能实现阻塞操作和非阻塞操作 ...

  5. Linux 设备驱动中的阻塞与非阻塞 I/O

    阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作.被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足.而非阻塞操作的进程在不能进行设备操作时 ...

  6. linux 同步与异步--阻塞与非阻塞型I/O

    同步阻塞IO 在这个模型中,应用程序(application)为了执行这个read操作,会调用相应的一个system call,将系统控制权交给kernel,然后就进行等待(这其实就是被阻塞了).ke ...

  7. linux设备驱动学习(四)——阻塞与非阻塞I/O

    1.阻塞与非阻塞I/O介绍 阻塞和非阻塞I/O是设备访问的两种不同模式.阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.被挂起的进程进入睡眠状态,被从调度器的 ...

  8. linux函数的阻塞与非阻塞IO及错误处理

    linux函数的阻塞与非阻塞IO及错误处理 1.阻塞是指进程等待某一个事件的发生而处于等待状态不往下执行,如果等待的事件发生了则会继续执行该进程.调用系统阻塞函数可能会导致进程阻塞进入睡眠状态. 2. ...

  9. linux网络编程--阻塞与非阻塞

    linux网络编程--阻塞与非阻塞 建立连接 接受连接 无阻塞的设置方式 read() write() 读操作 写操作 Linux fcntl函数详解 功能描述 函数原型 fcntl()函数五种功能 ...

  10. Linux 阻塞和非阻塞IO 实验

    目录 阻塞和非阻塞IO 阻塞和非阻塞简介 等待队列 轮询 Linux 驱动下的poll 操作函数 阻塞IO 实验 硬件原理图分析 实验程序编写 运行测试 非阻塞IO 实验 硬件原理图分析 实验程序编写 ...

最新文章

  1. python 怎样使list 里面的数据相加
  2. 解决Inno Setup制作安装包无法创建桌面快捷方式的问题
  3. SQL syntax-log2
  4. 5分钟了解TypeScript
  5. MapReduce综合学习含Wordcount案例
  6. Windows下多线程的使用
  7. 杨云 中科院计算机所,专家人才库数据----中国科学院计算技术研究所
  8. radvd移植到arm交叉编译问题解决
  9. ASP.net2.0调试JavaScript脚本
  10. AsyncResult使用场景
  11. How to build UDK2015?
  12. 简单实用的数据可视化案例
  13. javascript优缺点
  14. 移动物联网卡哪里可以办理
  15. Thief-Book鼠标控制翻页插件(Vscode )
  16. 遇到RAID5阵列硬盘出现问题的情况该如何解决?
  17. python文件操作seek()偏移量,读取指正到指定位置
  18. 什么是Linux 的xxd
  19. Opensips+Freeswitch负载均衡
  20. vue垂死挣扎--遇到的问题

热门文章

  1. css控制页面文字不能被选中user-select:none;
  2. 人物角色群体攻击判定二(叉乘来判断敌人的位置)
  3. Core IO学习心得
  4. 大学计算机专业高考听力,高考英语听力测试对考生听力策略反拨作用的研究
  5. 红帽企业版linux 7.4更新启动,红帽Linux企业版7.4 淘汰Btrfs文件系统
  6. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上
  7. linux服务器用哪个面板好,Linux服务器管理面板哪家比较好用?
  8. mysql与jframe_java-如何在JFrame上显示从mysql检索到的图像
  9. python实现胶囊网络_胶囊网络 -- Capsule Networks
  10. 创建css的时候选择器有哪几类,CSS3-CSS的选择器共有几类?