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.pswp.cn/news/384520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384520.shtml
英文地址,請注明出處:http://en.pswp.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;其中有本…