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

2021-06-05 17:59:15 字數 1888 閱讀 9217

有兩個可以進行控制串列埠阻塞性(同時控制read和write):乙個是在開啟串列埠的時候,open函式是否帶o_ndelay;第二個是可以在開啟串列埠之後通過fcntl()函式進行控制。

阻塞的定義:

對於read,block指當串列埠輸入緩衝區沒有資料的時候,read函式將會阻塞在這裡,移植到串列埠輸入緩衝區中有資料可讀取,read讀到了需要的位元組數之後,返回值為讀到的位元組數;

對於write,block指當串列埠輸出緩衝區滿,或剩下的空間小於將要寫入的位元組數,則write將阻塞,一直到串列埠輸出緩衝區中剩下的空間大於等於將要寫入的位元組數,執行寫入操作,返回寫入的位元組數。

非阻塞的定義:

對於read,no block指當串列埠輸入緩衝區沒有資料的時候,read函式立即返回,返回值為0。

對於write,no block指當串列埠輸出緩衝區滿,或剩下的空間小於將要寫入的位元組數,則write將進行寫操作,寫入當前串列埠輸出緩衝區剩下空間允許的位元組數,然後返回寫入的位元組數。

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

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;

}

static int open_port(int fd,int comport)   

}

/***********開啟串列埠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()函式進行設定即可。

阻塞:fcntl(fd,f_setfl,0)
非阻塞: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函式將會阻塞在這裡,移植到串列埠輸入緩...