我正在尝试将数据写入串行端口文件 / dev / ttyUSB0 ,如果操作失败5秒钟,我将继续前进。为了实现这一点,我选择使用 select()系统调用。但是,我使用它的确切情况似乎没有按预期工作。以下代码:
简单来说,我需要检查 8台设备的状态。所以我必须先写()一个查询命令。然后等待设备响应超时秒。
应对UART上连接的所有8个设备执行此过程。 我不确定是否必须重新初始化fdset以使用select。
结果:首次选择等待5秒超时。但之后它会立即显示“超时”而不等待。
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 10;
for(i=0; i <= noOfDevicesDiscovered; i++)
{
if( i < 9 && i > 0)
{
uart_init();
printf("ID: %d\n", i);
address = ((i-1)<<1) | 0x01;
command = 0xA0;
fd_set set;
FD_ZERO(&set);
FD_SET(uart_fd, &set);
write(uart_fd, &address, 1);
write(uart_fd, &command, 1);
rv = select(uart_fd + 1, &set, NULL, NULL, &timeout);
if(rv == -1)
perror("select\n");
else if(rv == 0)
{
printf("timeout\n");
new.level = 0;
new.address = i;
fwrite(&new, sizeof(struct Light_Info), 1, fptr);
continue;
}
else
{
read( uart_fd, &level, 1 );
new.level = level;
}
new.address = i;
fwrite(&new, sizeof(struct Light_Info), 1, fptr);
close(uart_fd);
FD_ZERO(&set);
}
}
我们如何解决这个问题。