串口打开返回 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,因为该值自上次失败的操作以来就存在。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 串口打开返回 EAGAIN
- av_buffersink_get_frame() 返回错误 AVERROR(EAGAIN) -11.
- aio_read from STDIN_FILENO在OS X中返回EAGAIN