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

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

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

相关文章

vi中如何实现批量替换

将文件tihuan&#xff08;假设此文本中字符a&#xff09;中的所有字符a换成字符w&#xff0c;其命令为&#xff1a; 1。vi tihuan 2。按esc键 3。按shift&#xff1a; 4。在&#xff1a;后输入 %s/a/w/g 其中s为&#xff1a;substitute&#xff0c;%表示所有行&#xff0c;…

C++里数组名+1和数组名的地址+1的区别

C/C里面的数组名字会退化为指针&#xff0c;所以数组名a实际指的是数组的第一个元素的地址。而数组名作为指针来讲有特殊性&#xff0c;它正在它所指向的内存区域中&#xff0c;&a的值和a的数值是相同的&#xff08;可以输出观察一下&#xff09;&#xff0c;但是类型和意义…

栈空间和堆空间的区别

栈空间用于存储函数参数和局部变量&#xff0c;所需空间由系统自动分配&#xff0c;回收也由系统管理&#xff0c;无需人工干预&#xff1b;堆空间用于存储动态分配的内存块&#xff0c;分配和释放空间均由程序员控制&#xff0c;有可能产生内存泄漏。 栈空间作为一个严格后进…

AD软件之模块化原理图

首先我们创建两个原理图文件 然后我们在Sheet2.SchDoc里放置一个页面符并双击绿色的方框 选择目标文件 我们选择我们刚才创建的Sheet4.SchDoc 然后在 视图——>面板——>Navigator选项 里点一下交互式导航 就可以看到Sheet4.SchDoc被添加到Sheet2.SchDoc下面了 通过上面…

进程与线程的区别(面试题)

进程与线程的区别 1.进程是资源分配最小单位&#xff0c;线程是程序执行的最小单位&#xff1b; 2..进程有自己独立的地址空间&#xff0c;每启动一个进程&#xff0c;系统都会为其分配地址空间&#xff0c;建立数据表来维护代码段、堆栈段和数据段&#xff0c;线程没有独立的…

查找表的原理与结构 什么是竞争与冒险现象?怎样判断?如何消除?

查找表的原理与结构&#xff1a; 查找表&#xff08;look-up-table&#xff09;简称为LUT&#xff0c;LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT&#xff0c;所以每一个LUT可以看成一个有 4位地址线的16x1的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路以…

AD软件操作技巧

本文介绍一些关于AD软件的实用小操作&#xff0c;这些小技巧可以大大的减少我们的工作量 一.批量操作丝印&#xff08;或者操作别的东西也可以&#xff0c;主要是凸显批量操作的思想&#xff09; 如下图假设我们工程里有很多丝印和焊盘等等&#xff0c;现在我想改批量地修改丝…

冒泡排序算法,C语言冒泡排序算法详解

冒泡排序是最简单的排序方法&#xff0c;理解起来容易。虽然它的计算步骤比较多&#xff0c;不是最快的&#xff0c;但它是最基本的&#xff0c;初学者一定要掌握。 冒泡排序的原理是&#xff1a;从左到右&#xff0c;相邻元素进行比较。每次比较一轮&#xff0c;就会找到序列中…

白话经典算法系列之六 快速排序 快速搞定

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高&#xff0c;因此经常被采用&#xff0c;再加上快速排序思想----分治法也确实实用&#xff0c;因此很多软件公司的笔试面试&#xff0c;包括像腾讯&#xff0c;微软等知名IT公司都喜欢考这个&#xff0c;还有大大小…

c语言中判断一个字符串是否包含另一个字符串

1. 使用库函数 string.h strstr函数 函数名: strstr 功 能: 在串中查找指定字符串的第一次出现 用 法: char *strstr(char *str1, char *str2); 说明&#xff1a;返回指向第一次出现str2位置的指针&#xff0c;如果没找到则返回NULL。 调用函数,判断返回值是否等于NULL…

C语言截取从某位置开始指定长度子字符串方法

c语言标准库没有截取部分字符串的函数&#xff0c;为啥&#xff1f;因为用现有函数strncpy&#xff0c;很容易做到&#xff01; char dest[4] {""}; char src[] {"123456789"}; strncpy(dest, src, 3); puts(dest); 输出结果为 123 看到了吗&#xff…

Modbus通讯协议详细解释

https://blog.csdn.net/rxiang12/article/details/79125813

V4L2框架分析

V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。v4L2是针对uvc&#xff08;USB Video Class&#xff09;免驱usb设备的编程框架&#xff0c;主要用于采集usb摄像头等。 下图是V4L2的框架&#xff0c;首先系统核心层分配设置注册一个名为cdev结构体变量&#x…

Linux下IO多路复用之select函数的使用

select函数的作用&#xff1a; 如果我们的程序里有两个需要阻塞的地方&#xff0c;例如要从服务器读数据&#xff0c;同时还要从键盘上读数据&#xff08;若不采用阻塞而用查询的方式则大量占用系统资源&#xff09;。这个时候我们就有两处阻塞&#xff0c;你当然可以用多线程或…

条件变量实现线程同步

(1) 什么是条件变量实现线程同步?   假如我们的程序中有两个线程&#xff0c;一个是生产者线程&#xff0c;另一个是消费者线程&#xff0c;生产者线程每隔一段时间把数据写入到缓冲区buffer中&#xff0c;而消费者线程则每隔一段时间从buffer中取出数据&#xff0c;为了避免…

mjpg-streamer框架分析

mjpg-streamer程框架图如下所示&#xff1a; 程序运行起来后&#xff0c;主进程根据传入的参数设置的输入输出通道打开对应的输入输出动态链接库&#xff0c;并依次调用以下函数 1、输入---仓库-----输出&#xff08;mjpg-streamer.h&#xff09; &#xff08;1&#xff09;gl…

用strace工具跟踪系统调用

Linux下可以用strace工具查看应用程序的系统调用。 strace -h 查看能调用的参数 1.strace -o xwatv.log xwatv //-o xwatv.log 是指定将跟踪信息存放在xwatv.log中&#xff0c;xwatv是指要跟踪的命令或应用程序 2.把生成的log文件拷贝回windows下进行分析 主要分析open…

linux字符驱动之概念介绍

一、字符驱动框架 问&#xff1a;应用程序open、read、write如何找到驱动程序的open、read、write函数&#xff1f; 答:应用程序的open、read、write是在C库里面实现的&#xff0c;它里面通过swi val指令去触发一个异常&#xff0c;这个异常就会进入到内核空间&#xff0c;在内…

linux字符驱动之自动创建设备节点

上一节中&#xff0c;我们是手工创建设备节点&#xff0c;大家肯定也会觉得这样做太麻烦了。 上一节文章链接&#xff1a;https://blog.csdn.net/qq_37659294/article/details/104302700 问&#xff1a;能不能让系统自动创建设备节点&#xff1f; 答&#xff1a;可以&#x…

linux字符驱动之点亮LED

上一节中&#xff0c;我们讲解了如何自动创建设备节点&#xff0c;这一节我们在上一节的基础上&#xff0c;实现点亮LED。 上一节文章链接&#xff1a;https://blog.csdn.net/qq_37659294/article/details/104308284 驱动里面能够用很多种方法实现LED驱动&#xff0c;其中有本…