串口打开返回EAGAIN

Serial port open returning EAGAIN

我在打开串行端口后立即收到 EAGAIN 错误。该代码在共享库中使用并由 Python 代码调用。

我知道端口 (/dev/ttyUSB0) 是好的。我使用相同的端口直接与 Python (PySerial) 通信并且工作正常。在那种情况下,我的设备会回答。

但是当从 ctypes (Python) 调用下面的代码时...我收到 EAGAIN 错误。

ERROR_CODES SerialPortLinux::openCommunication() {
    ERROR_CODES error_code;
    hComm = open(port_name.c_str(), O_RDWR | O_NOCTTY | O_SYNC);

    error_code = getPortErrorCode();
    if (error_code == ERROR_CODES::SUCCESS) {
        ...
    } else {
        close(hComm);
    }
    return error_code;
}


ERROR_CODES SerialPortLinux::getPortErrorCode(){
    ERROR_CODES error_code;
    auto error_number = errno;
    switch(error_number){
        ...
    }
}

在获取句柄之前是否需要进行配置? 我是否漏掉了一些明显的东西?

成功 调用任何 POSIX 系统函数后 errno 的值未指定,至少根据单一 Unix 规范 v6。您应该查看 open() 是否成功(即返回非负句柄),并且仅在 open() 失败时才分析 errno

所以,您的代码应该是:

ERROR_CODES SerialPortLinux::openCommunication()
{
    ERROR_CODES error_code;
    hComm = open(port_name.c_str(), O_RDWR | O_NOCTTY | O_SYNC);
    if (hComm == -1)
    {
        error_code = getPortErrorCode();
        // Treat this error condition somehow
        return error_code;
    }

    return ERROR_CODES::SUCCESS;
}

在您的特定情况下,我猜想 open() 操作成功了,但您仍然从 errno 获得了 EAGAIN,因为该值自上次失败操作以来一直存在。