Серийный порт открытый возврат EAGAIN - PullRequest
0 голосов
/ 24 сентября 2019

Я получаю ошибку 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 Ответ

2 голосов
/ 24 сентября 2019

Значение errno после успешного вызова любой системной функции POSIX не указано, по крайней мере, для Single Unix Specification v6.Вы должны увидеть, был ли 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() прошла успешно, но вы все равно получили EAGAIN от errno, потому что это значение было там с момента последней неудачной операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...