无法在Ubuntu的g ++中打开串行端口

问题描述 投票:0回答:1

我正在尝试运行开发激光雷达单元(RPLIDAR A1M8 360度激光扫描仪套件)附带的示例程序。使用g ++可以正确编译Linux目标的示例代码(Ubuntu 7.4.0-1ubuntu1〜18.04.1)7.4.0但是,当我运行它时,它停止并显示消息“错误,无法绑定到指定的串行端口/ dev / ttyUSB0”。使用gdb,我可以将代码追溯到对__libc_open64的串行端口open调用,这里不再有源代码了……

__ libc_open64(file = 0x5555557832a9“ / dev / ttyUSB0”,oflag = 2306,位于../ sysdeps / unix / sysv / linux / open64.c:36}]

36 ../sysdeps/unix/sysv/linux/open64.c:无此类文件或目录。

到目前为止,我在这里尝试消除明显的故障模式:

  1. 该串行端口是ttyUSB0上的USB到串行转换器,在Putty上工作正常(115200、8,无,1,仅软件流控制)。我将其连接到Raspberry Pi作为控制台,以获取大量数据而不会出现问题,并且可以与控制台进行双向交互。因此,我认为端口和转换器工作正常
  2. 调用__libc_open64的代码段是...
bool raw_serial::open(const char * portname, uint32_t baudrate, uint32_t flags) 
{ 
if (isOpened()) close(); 
serial_fd = ::open(portname, O_RDWR | O_NOCTTY | O_NDELAY);

我查找了一起进行或运算的常量,并对值(04403)进行了硬编码,以防头文件的版本出现问题。奇怪的是,该值与gdb行中的oflag值偏离了1。编译运行,没有区别

  1. 我已验证对:: open的调用返回了-1,这在紧随其后的代码中被视为失败

  2. 我在dmesg中看到ttyUSB0已打开并且可用

我不是c ++人。在我看来,这似乎是g ++ __libc_open64代码的问题,但这似乎也不太可能。我不知道下一步要去哪里。任何建议将不胜感激。

收到的第一条评论指出了权限。在开始本练习之前,我将/ dev / ttyUSB0完全打开。

我跑了一下,看到了那条线...

openat(AT_FDCWD, "/dev/ttyUSB0", O_ACCMODE|O_NOCTTY|O_NONBLOCK) = -1 ENOENT (No such file or directory)

好吧,这很尴尬!它返回权限被拒绝!是的,我更改了权限的权限,然后立即忘记了作为USB设备的情况,当我再次拔出/插入USB设备时,它消失了并重新定义。 谢谢您的帮助!

c++ linux
1个回答
0
投票

strace将显示“权限被拒绝”的预测是正确的。我忘记了这不是固定的串行端口,而是USB到串行转换器。即使我更改了权限并验证了它是否可与Putty一起使用,但我忘记了重新启动或拔下USB后,/ dev / ttyUSB0设备会消失并在重新引导或插入时重新创建,这要求再次设置权限。

© www.soinside.com 2019 - 2024. All rights reserved.