我在/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配置了端口,我使用完全相同的配置。
答案 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
的值。还要确保文件描述符处于非阻塞模式。