有兩個能夠進行控制串口阻塞性(同時控制read和write):一個是在打開串口的時候,open函數是否帶O_NDELAY;第二個是能夠在打開串口以後經過fcntl()函數進行控制。linux
阻塞的定義:ios
對於read,block指當串口輸入緩衝區沒有數據的時候,read函數將會阻塞在這裏,移植到串口輸入緩衝區中有數據可讀取,read讀到了須要的字節數以後,返回值爲讀到的字節數;函數
對於write,block指當串口輸出緩衝區滿,或剩下的空間小於將要寫入的字節數,則write將阻塞,一直到串口輸出緩衝區中剩下的空間大於等於將要寫入的字節數,執行寫入操做,返回寫入的字節數。spa
非阻塞的定義:.net
對於read,no block指當串口輸入緩衝區沒有數據的時候,read函數當即返回,返回值爲0。blog
對於write,no block指當串口輸出緩衝區滿,或剩下的空間小於將要寫入的字節數,則write將進行寫操做,寫入當前串口輸出緩衝區剩下空間容許的字節數,而後返回寫入的字節數。ip
- static int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop)
- {
- struct termios newtio;
- struct termios oldtio;
-
- if(tcgetattr(fd,&oldtio) != 0)
- {
- perror("SetupSerial 1");
- return -1;
- }
-
- bzero(&newtio,sizeof(newtio));
- newtio.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 57600:
- cfsetispeed(&newtio,B57600);
- cfsetospeed(&newtio,B57600);
- 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] = 1;
- newtio.c_cc[VMIN] = FRAME_MAXSIZE;
-
- tcflush(fd,TCIFLUSH);
- if((tcsetattr(fd,TCSANOW,&newtio)) != 0)
- {
- perror("com set error");
- return -1;
- }
- printf("set done!\n");
- return 0;
- }
- static int open_port(int fd,int comport)
- {
- if(comport == 1)
- {
- fd = open("/dev/ttyAT1",O_RDWR|O_NOCTTY|O_NDELAY);
- if(fd == -1){
- perror("Can't Open Serial Port");
- return -1;
- }
- }
-
- else if(comport == 2)
- {
- fd = open("/dev/ttyAT2",O_RDWR|O_NOCTTY|O_NDELAY);
- if(fd == -1){
- perror("Can't Open Serial Port");
- return -1;
- }
- }
- else if(comport == 3)
- {
- fd = open("/dev/ttyAT3",O_RDWR|O_NOCTTY|O_NDELAY);
- if(fd == -1){
- perror("Can't Open Serial Port");
- return -1;
- }
- }
- if(comport == 1)
- {
- if(fcntl(fd,F_SETFL,FNDELAY) < 0)
- {
- printf("fcntl failed\n");
- }
- else{
- printf("fcntl=%d\n",fcntl(fd,F_SETFL,FNDELAY));
- }
- }
- else
- {
- if(fcntl(fd,F_SETFL,0) < 0){
- printf("fcntl failed\n");
- }
- else{
- printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));
- }
- }
- if(isatty(STDIN_FILENO) == 0){
-
- printf("standard input is not a terminal device\n");
- }
- else{
-
- printf("isatty sucess!\n");
- }
-
- printf("fd-open=%d\n",fd);
- return fd;
- }
因此,linux的串口的阻塞性經過fcntl()函數進行設置便可。terminal
- 非阻塞:fcntl(fd,F_SETFL,FNDELAY)