0

我在 /dev/ttyUSB0 上的 XBee rf 模块上使用 Select() sys cal。但是这个 syscal 只是不返回(仅在超时时返回),但是如果我在这个端口上的 WHILE 循环中使用 read(),我可以看到数据传入

 /*code to open the port*/
 system("stty -F /dev/ttyUSB0 5:0:8bd:0:3:1c:7f:15:1:64:0:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0");
fd = open("/dev/ttyUSB0", O_RDWR  );
printf("fd is %d",fd);
if(fd == -1)
    return ERR_PORT;

选择仅在 TIMEOUT 时返回,而不是在端口准备好读取时返回

FD_ZERO (&set);
FD_SET (fd, &set);//fd is an opened file des. for /dev/ttyUSB0
struct timeval timeout;
timeout.tv_sec = 50;
timeout.tv_usec = 0;

if(select(FD_SETSIZE,&set, NULL,NULL,&timeout)==1)
  Do_stuff();
else
  return TIMEOUT;

但如果我使用以下我可以看到正在打印的数据

char ch;
while(1)
{
 read(fd,&ch,1);
printf("\n0x%X",ch);
}

请注意:关于system()函数中的命令,我在stty -F /dev/USB0 -g打开 GTKterm 后发出它/dev/ttyUSB0。(那是我能够从我的程序与我的调制解调器交谈的时候)所以猜测 GTKterm 配置了端口,我使用了完全相同配置。

4

2 回答 2

2

如果您在循环中使用 select()(我想您这样做),请注意在循环的每次迭代中设置 fd_set() 和 tv_sec, tv_usec ,另外:您的 printf 格式不会以 \n 结尾,因此输出不会被冲洗。相反,它以 \n 开头,因此它将在相关输出出现之前被刷新。

于 2011-09-27T12:02:55.533 回答
1

第一个参数select()是集合中最高的文件描述符加一个。你的陈述应该是:

if (select(fd + 1,&set, NULL,NULL,&timeout) == 1)
{
   ...
}

编辑:您还假设如果select()不返回 1,那是由于超时问题,只有在返回 0 时才成立。检查 -1 返回并报告 的值errno。还要确保文件描述符处于非阻塞模式。

于 2011-09-27T11:17:31.750 回答