1:首先需要定义保存你打开文件的文件描述符变量,和你要侦听的文件描述符集。
int cd_fd=0,rf_fd=0,max_fd;
fd_set rd;
2:打开设备,保存文件描述符
if((cd_fd=open_port(cd_fd,3))<0)
{
perror("open_port error");
return 0 ;
}
if((rf_fd=open_port(rf_fd,2))<0)
{
perror("open_port error");
return 0 ;
}
3:初始化文件描述符集为0,并添加打开的设备到文件描述符集
FD_ZERO(&rd);
FD_SET(cd_fd, &rd); ////添加之后FD_ISSET(cd_fd, &rd)返回值就变成1,就说名FD_ISSET是检测当前文件描述符时候在文件描述符集当中,如果是,就返回1.
FD_SET(rf_fd, &rd); //FD_ISSET(cd_fd, &rd)=1
max_fd=((cd_fd>rf_fd)?cd_fd:rf_fd);
4:监听,并读取,写入操作
while(1)
{
if(select(max_fd+1, &rd, NULL,NULL,NULL)<0) //对于监听多个文件,监听之后select就会把没有数据触发的文件的文件描述符删除掉。
{
perror("select fail ");
}
else
{
printf("2isset_cd=%d,2isset_rf=%d\n",FD_ISSET(cd_fd, &rd),FD_ISSET(rf_fd, &rd));//如果我第一次触发cd_fd设备,让其触发。FD_ISSET(cd_fd, &rd)=1,FD_ISSET(rf_fd, &rd)=0,也即把rf_fd文件描述符从文件描述符集中删除掉了
if(FD_ISSET(cd_fd, &rd))
{
nread=read(cd_fd, cd_buff, COUNT);//card=14 rf=10
{
printf("cd_nread=%d, %s\n",nread, cd_buff);
//tcflush(cd_fd,TCIFLUSH);
}
}
if(FD_ISSET(rf_fd, &rd))
{
nread=read(rf_fd, rf_buff, COUNT);//card=14 rf=10
{
printf("rf_nread=%d, %s\n",nread, rf_buff);
//tcflush(rf_fd,TCIFLUSH);
}
}
printf("3isset_cd=%d,3isset_rf=%d\n",FD_ISSET(cd_fd, &rd),FD_ISSET(rf_fd, &rd));
}
FD_ZERO(&rd);
FD_SET(cd_fd, &rd);
FD_SET(rf_fd, &rd);
}
所以如果你想每个循环让select监测所有的文件,就必须在循环当中添加
FD_ZERO(&rd);
FD_SET(cd_fd, &rd);
FD_SET(rf_fd, &rd);让其所有的文件描述符再添加到文件描述符集当中