这个问题已经回答了,请看结尾,并评论。
为什么libserial在打开流时抛出“坏文件描述符”?
这一问题已在不同论坛上多次提出,包括在这里。这些答案都解决不了我的问题。
运行下面的简单代码使iostream (父级到SerialStream)抛出一个“坏的文件描述符”。
我已经尽可能地把这个问题孤立在这里。设置如下:
(libserial)
#include <libserial/SerialPort.h>
#include <libserial/SerialStream.h>
#include <iostream>
using namespace std;
using namespace LibSerial;
int main() {
SerialPort aPort;
SerialStream aStream;
try {
aPort.Open("/dev/ttyUSB0");
aStream.Open("/dev/ttyUSB0"); // <-- This fails
} catch (exception& e) {
cout << e.what() << endl;
}
return 0;
}使输出
21:46:34 *构建用于项目测试的配置调试*生成
所有构建文件:../src/test.cpp调用: GCC C++编译器g++
-std=c++1y -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/test.d“-MT"src/test.o”“-o "src/test.o”./src /test.cpp“已完成构建:./src/test.cpp构建目标:测试调用:
GCC C++ Linker g++ -o "test“./src/test.o -lserial完成
建设目标:测试21:46:35完成建设。0错误,0警告。
(花费108毫秒)
运行此操作将生成e.what()中的“坏文件描述符”,并由aStream.Open(“/dev/ttyUSB0”)引发;观察到aPort.Open(“/dev/ttyUSB0”)使其通过。
其他一些事实也是:
agda@agda-虚拟:~$ dmesg \ grep tty
0.073253 printk:控制台tty0启用0.755452 00:05: ttyS0 at I/O 0x3f8 (irq = 4,base_baud = 115200)是一个16550 A 0.794338 tty tty4:散列匹配3.909769 USB2-2.1:FTDI usb串行设备转换器现在附加到ttyUSB0 agda @agda-虚拟:~$组agda
agda : agda adm dialout cdrom sudo dip plugdev lpadmin sambashare agda@agda-虚拟:~$ ls -l
crw-rw
我由此得出的结论是,串行dongle被挂载并以"/dev/ttyUSB0“的形式工作。权限是正确的,组是正确的。
呼叫树没有给我任何线索:
线程#1测试4978 core: 2 __GI_raise() at raise.c:50 0x7ff7bc818b
__GI_abort() at abort.c:79 0x7ff7ba7859
0x7ff7e2d951
0x7ff7e3947c
std::终止()在0x7ff7e394e7
__cxa_rethrow()在0x7ff7e397ed
0x7ff7f7a28a
main()在test.cpp:19 0x55555553f6
我在这里错过了什么?
如果我不能在我的特定系统上解决这个问题,任何关于USB异步通信的其他方式的建议都是非常感谢的。
答案:正如codo在评论中指出的那样,不可能打开同一个串行通道两次。我已经纠正了这一点,现在它在真正的代码中运行得很好。这是一个错误,因为阅读文档草率,而不是从一个坏的例子中复制代码。
对于遇到同样问题的任何人: SerialPort和SerialStream是两种使用libserial访问串行端口的替代方法。用其中之一。
发布于 2021-03-25 00:38:39
正如Codo在评论中所述,不可能打开同一串行通道两次。我已经纠正了这一点,现在它在真正的代码中运行得很好。这是一个错误,因为阅读文档草率,而不是从一个坏的例子中复制代码。
对于任何遇到同样问题的人: SerialPort和SerialStream是使用libserial访问串行端口的两种替代方法。用其中之一。
https://stackoverflow.com/questions/66789336
复制相似问题