串口打开返回 EAGAIN

Serial port open returning EAGAIN

本文关键字:EAGAIN 返回 串口      更新时间:2023-10-16

打开串行端口后立即收到 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,因为该值自上次失败的操作以来就存在。