在循环和多个操作中使用select系统调用

时间:2015-04-13 08:34:08

标签: c linux select uart

我正在尝试将数据写入串行端口文件 / 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); 
                }
}

我们如何解决这个问题。

0 个答案:

没有答案