Linux串口阻塞与非阻塞
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串口阻塞与非阻塞相关推荐
- Linux 使用fcntl c_cc[VMIN] c_cc[CTIME]设置串口阻塞与非阻塞读取数据
一.概述 Linux串口非常灵活,可以根据需要配置成标准串口和自定义串口模式,就Linux 串口读取数据来说,有有两种主要方式:阻塞与非阻塞. 阻塞:一直等待数据,直到退出条件成立: 非阻塞:及时返回 ...
- linux非阻塞输入函数,Linux fcntl函数设置阻塞与非阻塞
转自http://www.cnblogs.com/xuyh/p/3273082.html 用命令F_GETFL和F_SETFL设置文件标志,比如阻塞与非阻塞 F_SETFL 设置给arg描述符 ...
- linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O
今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式. 一.基本概念: 阻塞操作 ...
- Linux驱动(六)设备驱动中的阻塞与非阻塞IO
我们在Linux学习(二十三)IO模型中了解了LINUX中IO模型,IO模型最简单的可以分为阻塞IO和非阻塞IO.并且学习了一个用如何使用阻塞操作和非阻塞操作.而应用层之所以能实现阻塞操作和非阻塞操作 ...
- Linux 设备驱动中的阻塞与非阻塞 I/O
阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作.被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足.而非阻塞操作的进程在不能进行设备操作时 ...
- linux 同步与异步--阻塞与非阻塞型I/O
同步阻塞IO 在这个模型中,应用程序(application)为了执行这个read操作,会调用相应的一个system call,将系统控制权交给kernel,然后就进行等待(这其实就是被阻塞了).ke ...
- linux设备驱动学习(四)——阻塞与非阻塞I/O
1.阻塞与非阻塞I/O介绍 阻塞和非阻塞I/O是设备访问的两种不同模式.阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.被挂起的进程进入睡眠状态,被从调度器的 ...
- linux函数的阻塞与非阻塞IO及错误处理
linux函数的阻塞与非阻塞IO及错误处理 1.阻塞是指进程等待某一个事件的发生而处于等待状态不往下执行,如果等待的事件发生了则会继续执行该进程.调用系统阻塞函数可能会导致进程阻塞进入睡眠状态. 2. ...
- linux网络编程--阻塞与非阻塞
linux网络编程--阻塞与非阻塞 建立连接 接受连接 无阻塞的设置方式 read() write() 读操作 写操作 Linux fcntl函数详解 功能描述 函数原型 fcntl()函数五种功能 ...
- Linux 阻塞和非阻塞IO 实验
目录 阻塞和非阻塞IO 阻塞和非阻塞简介 等待队列 轮询 Linux 驱动下的poll 操作函数 阻塞IO 实验 硬件原理图分析 实验程序编写 运行测试 非阻塞IO 实验 硬件原理图分析 实验程序编写 ...
最新文章
- python 怎样使list 里面的数据相加
- 解决Inno Setup制作安装包无法创建桌面快捷方式的问题
- SQL syntax-log2
- 5分钟了解TypeScript
- MapReduce综合学习含Wordcount案例
- Windows下多线程的使用
- 杨云 中科院计算机所,专家人才库数据----中国科学院计算技术研究所
- radvd移植到arm交叉编译问题解决
- ASP.net2.0调试JavaScript脚本
- AsyncResult使用场景
- How to build UDK2015?
- 简单实用的数据可视化案例
- javascript优缺点
- 移动物联网卡哪里可以办理
- Thief-Book鼠标控制翻页插件(Vscode )
- 遇到RAID5阵列硬盘出现问题的情况该如何解决?
- python文件操作seek()偏移量,读取指正到指定位置
- 什么是Linux 的xxd
- Opensips+Freeswitch负载均衡
- vue垂死挣扎--遇到的问题
热门文章
- css控制页面文字不能被选中user-select:none;
- 人物角色群体攻击判定二(叉乘来判断敌人的位置)
- Core IO学习心得
- 大学计算机专业高考听力,高考英语听力测试对考生听力策略反拨作用的研究
- 红帽企业版linux 7.4更新启动,红帽Linux企业版7.4 淘汰Btrfs文件系统
- python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上
- linux服务器用哪个面板好,Linux服务器管理面板哪家比较好用?
- mysql与jframe_java-如何在JFrame上显示从mysql检索到的图像
- python实现胶囊网络_胶囊网络 -- Capsule Networks
- 创建css的时候选择器有哪几类,CSS3-CSS的选择器共有几类?