无限“资源暂时不可用”错误

时间:2016-05-12 14:57:25

标签: c linux serial-port arm

我编写了一个程序,可以不断地从自定义硬件的USB串行端口写入和读取。对于每次写入,总会有来自硬件的响应。

有时(以天为单位),每次调用写入都会返回EAGAIN错误,无论我多少次尝试调用它。

唯一可以在不重启的情况下再次工作的替代方法是向USB端口发出unbind和rebind命令,如:

# echo -n "1-3.2" > /sys/bus/usb/drivers/usb/unbind
# echo -n "1-3.2" > /sys/bus/usb/drivers/usb/bind

我想知道这是自定义硬件中的问题,但我不知道如何证明它,所以我可以要求制造商修复它。

我还可以检查哪些内容以确保代码中没有问题?

以下是端口的打开方式:

int open_port(const char * portname)
{
    struct termios termAttr;
    struct stat st0;
    struct stat st1;
    int flock_ret;
    int fd;

    fd = open(portname, O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1)
    {
        printf("Can't open %s. %s", portname,
                strerror(errno));
    }
    else
    {
        fcntl(fd, F_SETFL, FNDELAY);
        tcgetattr(fd, &termAttr);
        cfsetispeed(&termAttr, B115200);
        cfsetospeed(&termAttr, B115200);

        termAttr.c_cflag |= (CLOCAL | CREAD | CS8);
        termAttr.c_iflag |= (IGNPAR | IGNBRK);

        termAttr.c_cc[VMIN] = 0;
        termAttr.c_cc[VTIME] = 0;

        tcflush(fd, TCIFLUSH);
        if (tcsetattr(fd, TCSANOW, &termAttr) == -1)
        {
            printf("%s", strerror(errno));
        }
    }

    return fd;
}

这是写作的方式:

void serial_write(int fd, char *comando)
{
    int cont = 0;
    int bytes_written;
    char ret[20];
    int lenght;
    char cmdfinal[200];

    if (!fd)
    {
        printf("** Error at %s: %s **", __func__, strerror(errno));
        return;
    }

    sprintf(cmdfinal, "%s\r", comando);

    lenght = strlen(cmdfinal);


    bytes_written = write(fd, cmdfinal, lenght);

    //Check for errors
    if (bytes_written == -1)
    {
        if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
        {
            //Wait so the next call have more chances to work
            sleep(5);
        }

        //Just print the error 
        printf("%s", strerror(errno));

        //Reopen the port
        serial_somlcd_close();
        serial_somlcd_open();
    }
    else
    {
        //Do things w/ response
    }

}

0 个答案:

没有答案