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