当有一些数据要读取时,select()会阻塞

时间:2016-05-04 12:17:57

标签: c serial-port

我正在尝试在串行端口上实现阻塞读取。我有以下代码

int blocking_read(int input_fd,int wait_time){
    if(wait_time <= 0) return 0;
    fd_set set;
    FD_ZERO(&set);
    FD_SET(input_fd,&set);
    struct timeval wait_time_struct;
    wait_time_struct.tv_sec = wait_time / 1000000;
    wait_time_struct.tv_usec = wait_time % 1000000;
    int ret = select(1,&set,NULL,NULL,&wait_time_struct); 
    char a;
    int check=read(input_fd,&a,1);
    printf ("ret %d, check %d %02x\n",ret,check,a&0xFF);
    return ret;
}

最后4行仅用于调试... 当我在循环中期望串口上的消息时运行它时,输出为:

ret 0, check 1 ff
ret 0, check 1 ff
ret 0, check 1 c4
ret 0, check 1 d7
ret 0, check 1 00
ret 0, check 1 01
...

并且我期望的消息是FF FF C4 D7 00 01....所以很明显,select()块即使有什么东西可以阅读......你能帮我吗?

1 个答案:

答案 0 :(得分:4)

我应该使用这样的选择:

int ret = select(input_fd +1,&set,NULL,NULL,&wait_time_struct); 

参数名称nfds让我感到困惑,它只是看起来像集合中的一些文件描述符。来自手册

nfds is the highest-numbered file descriptor in any of the three sets, plus 1.