Linux串列埠阻塞與非阻塞

2021-09-27 12:32:31 字數 1837 閱讀 3145

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

int set_opt(int fd,int nspeed, int nbits, char nevent, int nstop)

bzero( &newtio, sizeof( newtio ) ); //新結構體清0

newtio.c_cflag |= clocal | cread;

newtio.c_cflag &= ~csize;

switch( nbits )

/*** 奇偶校驗 ***/

switch( nevent )

/*** 設定波特率 ***/

switch( nspeed )

/*** 設定停止位 ***/

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)

// printf("set done!\n\r");

return 0;

}

linux 串列埠阻塞與非阻塞引數設定

在串列埠設定中,有以下兩個引數可以決定是否阻塞。在開啟串列埠時不加o nodelay,可用下面的第二種方法,來進行阻塞 非阻塞的設定 c cc vtime 非規範模式讀取時的超時時間 單位 百毫秒 可以這麼理解,從接收到後乙個位元組開始計時,如果超時,則退出read c cc vmin 非規範模式讀...

Linux阻塞與非阻塞

1.阻塞 block 概念 指程序或執行緒在執行裝置操作或管道,或則網路時,不能獲取到資源就被掛起,直到滿足可操作的條件後在進行操作,被掛起的程序進入休眠狀態,從執行佇列移走,直到 等待的條件滿足才繼續執行。也就是執行到某些函式時必須等待某個事件發生函式才返回。2.非阻塞 non block 程序就...

linux下串列埠的阻塞和非阻塞操作

有兩個可以進行控制串列埠阻塞性 同時控制read和write 乙個是在開啟串列埠的時候,open函式是否帶o ndelay 第二個是可以在開啟串列埠之後通過fcntl 函式進行控制。阻塞的定義 對於read,block指當串列埠輸入緩衝區沒有資料的時候,read函式將會阻塞在這裡,移植到串列埠輸入緩...