您的位置:首页 > 运维架构 > Linux

有关linux串口的操作

2014-03-31 21:08 295 查看
有关串口阻塞非阻塞的问题

有两个可以进行控制串口阻塞性(同时控制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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: