有兩個可以進行控制串列埠阻塞性(同時控制read和write):乙個是在開啟串列埠的時候,open函式是否帶o_ndelay;第二個是可以在開啟串列埠之後通過fcntl()函式進行控制。
阻塞的定義:
對於read,block指當串列埠輸入緩衝區沒有資料的時候,read函式將會阻塞在這裡,移植到串列埠輸入緩衝區中有資料可讀取,read讀到了需要的位元組數之後,返回值為讀到的位元組數;
對於write,block指當串列埠輸出緩衝區滿,或剩下的空間小於將要寫入的位元組數,則write將阻塞,一直到串列埠輸出緩衝區中剩下的空間大於等於將要寫入的位元組數,執行寫入操作,返回寫入的位元組數。
非阻塞的定義:
對於read,no block指當串列埠輸入緩衝區沒有資料的時候,read函式立即返回,返回值為0。
對於write,no block指當串列埠輸出緩衝區滿,或剩下的空間小於將要寫入的位元組數,則write將進行寫操作,寫入當前串列埠輸出緩衝區剩下空間允許的位元組數,然後返回寫入的位元組數。
[cpp]view plain
copy
static
intset_opt(
intfd,
intnspeed,
intnbits,
char
nevent,
intnstop)
bzero(&newtio,sizeof
(newtio));
newtio.c_cflag |= clocal |cread;
newtio.c_cflag &= ~csize;
/***********資料位選擇****************/
switch
(nbits)
/***********校驗位選擇****************/
switch
(nevent)
/***********波特率選擇****************/
switch
(nspeed)
/***********停止位選擇****************/
if(nstop == 1)
else
if(nstop ==2)
newtio.c_cc[vtime] = 1;
newtio.c_cc[vmin] = frame_maxsize; //阻塞條件下有效
tcflush(fd,tciflush);
if((tcsetattr(fd,tcsanow,&newtio)) != 0)
printf("set done!\n"
);
return
0;
}
[cpp]view plain
copy
static
intopen_port(
intfd,
intcomport)
}
/***********開啟串列埠2****************/
else
if(comport == 2)
}
/***********開啟串列埠3****************/
else
if(comport == 3)
}
if(comport == 1)
else
} else
else
}
if(isatty(stdin_fileno) == 0)
else
printf("fd-open=%d\n"
,fd);
return
fd;
}
所以,linux的串列埠的阻塞性通過fcntl()函式進行設定即可。
[cpp]view plain
copy
阻塞:fcntl(fd,f_setfl,0)
[cpp]view plain
copy
非阻塞:fcntl(fd,f_setfl,fndelay)
linux下串列埠的阻塞和非阻塞操作
有兩個可以進行控制串列埠阻塞性 同時控制read和write 乙個是在開啟串列埠的時候,open函式是否帶o ndelay 第二個是可以在開啟串列埠之後通過fcntl 函式進行控制。阻塞的定義 對於read,block指當串列埠輸入緩衝區沒有資料的時候,read函式將會阻塞在這裡,移植到串列埠輸入緩...
linux下串列埠的阻塞和非阻塞操作
有兩個可以進行控制串列埠阻塞性 同時控制read和write 乙個是在開啟串列埠的時候,open函式是否帶o ndelay 第二個是可以在開啟串列埠之後通過fcntl 函式進行控制。阻塞的定義 對於read,block指當串列埠輸入緩衝區沒有資料的時候,read函式將會阻塞在這裡,移植到串列埠輸入緩...
linux下串列埠的阻塞和非阻塞操作
有兩個可以進行控制串列埠阻塞性 同時控制read和write 乙個是在開啟串列埠的時候,open函式是否帶o ndelay 第二個是可以在開啟串列埠之後通過fcntl 函式進行控制。阻塞的定義 對於read,block指當串列埠輸入緩衝區沒有資料的時候,read函式將會阻塞在這裡,移植到串列埠輸入緩...