有关linux串口的操作
2014-03-31 21:08
295 查看
有关串口阻塞非阻塞的问题
有两个可以进行控制串口阻塞性(同时控制read和write):一个是在打开串口的时候,open函数是否带O_NDELAY;第二个是可以在打开串口之后通过fcntl()函数进行控制:阻塞为fcntl(fd,F_SETFL,0);非阻塞为fcntl(fd,F_SETFL,FNDELAY);
有两个可以进行控制串口阻塞性(同时控制read和write):一个是在打开串口的时候,open函数是否带O_NDELAY;第二个是可以在打开串口之后通过fcntl()函数进行控制:阻塞为fcntl(fd,F_SETFL,0);非阻塞为fcntl(fd,F_SETFL,FNDELAY);
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; b540 } /***********停止位选择****************/ 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 comport) { int fd; /***********打开串口1****************/ if(comport == 1){ fd = open("/dev/ttyAT1",O_RDWR|O_NOCTTY|O_NDELAY); if(fd == -1){ perror("Can't Open Serial Port"); return -1; } } /***********打开串口2****************/ 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; } } /***********打开串口3****************/ 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){//非阻塞,覆盖前面open的属性 printf("fcntl failed\n"); } else{ printf("fcntl=%d\n",fcntl(fd,F_SETFL,FNDELAY)); } } else{ if(fcntl(fd,F_SETFL,0) < 0){ //阻塞,即使前面在open串口设备时设置的是非阻塞的,这里设为阻塞后,以此为准 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调试器的实现---有关寄存器操作的实现
- Linux下串口操作之数据拼接
- linux串口操作及设置详解
- [Linux]有关基本操作的资源
- linux下串口的阻塞和非阻塞操作
- Linux下串口操作之数据拼接
- Linux 操作命令(有关文件)
- Linux串口操作的一段代码
- linux下串口的阻塞和非阻塞操作
- linux操作串口需要用到的头文件
- linux下串口的阻塞和非阻塞操作
- Linux 控制台下串口的基本操作
- linux下串口的阻塞和非阻塞操作
- linux 基本命令的学习---有关文件操作命令的学习
- linux串口操作及设置详解
- linux下串口协议控制51单片机(涉及多线程操作)
- [LINUX] 有关服务器配置的操作
- linux 串口操作详解
- linux有关文件共享的操作
- linux串口操作及设置详解 (转载)