选择()始终阻止/ dev / ttyUSB0

时间:2011-09-27 11:09:33

标签: c linux usbserial

我在/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配置了端口,我使用完全相同的配置。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

编辑:您还假设select()未返回1,这是由于超时问题,仅当返回0时才为真。检查-1返回并报告errno的值。还要确保文件描述符处于非阻塞模式。