我正在尝试在串行端口上实现阻塞读取。我有以下代码
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()
块即使有什么东西可以阅读......你能帮我吗?
答案 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.