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函式將會阻塞在這裡,移植到串列埠輸入緩...