首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SerialStream.Open实例(“/dev/ttyUSB0”)抛出一个异常“坏文件描述符”[libserial,lubunto,c++]

SerialStream.Open实例(“/dev/ttyUSB0”)抛出一个异常“坏文件描述符”[libserial,lubunto,c++]
EN

Stack Overflow用户
提问于 2021-03-24 21:02:40
回答 1查看 277关注 0票数 1

这个问题已经回答了,请看结尾,并评论

为什么libserial在打开流时抛出“坏文件描述符”?

这一问题已在不同论坛上多次提出,包括在这里。这些答案都解决不了我的问题。

运行下面的简单代码使iostream (父级到SerialStream)抛出一个“坏的文件描述符”。

我已经尽可能地把这个问题孤立在这里。设置如下:

(libserial)

  • The

  • Lubunto 20.04在WmWare player 16 (最新的)

  • 中,代码作为托管项目

  • 在Eclipse中运行,链接库是串行的,usb串行端口连接到ftdi,usb到串行dongle

  • libserial在v 1.0.0.something

  • gcc c++14

  • Compiles,链接没有错误,warnings

  • Debugging和ftdi

代码语言:javascript
复制
#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”)使其通过。

其他一些事实也是:

  • Connecting gtkterm to "/dev/ttyUSB0“运行良好的,设备名称和用户权限的物理输出verified
  • Testing提供:

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访问串行端口的替代方法。用其中之一。

EN

回答 1

Stack Overflow用户

发布于 2021-03-25 00:38:39

正如Codo在评论中所述,不可能打开同一串行通道两次。我已经纠正了这一点,现在它在真正的代码中运行得很好。这是一个错误,因为阅读文档草率,而不是从一个坏的例子中复制代码。

对于任何遇到同样问题的人: SerialPort和SerialStream是使用libserial访问串行端口的两种替代方法。用其中之一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66789336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档