串行端口打开并返回EAGAIN

时间:2019-09-24 17:32:22

标签: c++ linux serial-port

打开串行端口后,我立即收到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){
        ...
    }
}

在获取手柄之前是否需要进行配置? 我缺少明显的东西吗?

1 个答案:

答案 0 :(得分:2)

至少在单个Unix规范v6中,未对系统调用成功后对errno的值进行指定。您应该查看open()是否成功(即返回非负句柄),并仅在errno失败时分析open()

因此,您的代码应为:

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,因为该值自上次失败操作以来一直存在。