首页 > 解决方案 > 无法在 Ubuntu 上的 g++ 中打开串行端口

问题描述

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

__libc_open64 (file=0x5555557832a9 "/dev/ttyUSB0", oflag=2306) at ../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);

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

  1. 我验证了对 ::open 的调用返回了 -1,这在代码中被立即视为失败

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

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

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

我跑了strace,看到了这条线......

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

嗯,这很尴尬! 它返回 Permission Denied!是的,我完全打开了 chmoded 权限,然后立即忘记了它是一个 USB 设备,当我再次拔下/插入它时,它会消失并重新定义。谢谢您的帮助!

标签: c++linux

解决方案


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


推荐阅读