【发布时间】:2020-03-02 03:20:44
【问题描述】:
我正在尝试运行开发激光雷达单元(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: 没有这样的文件或目录。
这是我迄今为止为消除明显的故障模式所做的尝试:
- 串行端口是 ttyUSB0 上的 USB 到串行转换器,可以在 Putty 上正常工作(115200、8、无、1,仅限软件流控制)。我将它连接到 Raspberry Pi 作为控制台,以毫无问题地获取大量数据,并且可以与控制台进行双向交互。因此我认为端口和转换器工作正常
- 调用 __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。编译运行,没区别
-
我验证了对 ::open 的调用返回了 -1,这在代码中被立即视为失败
-
我可以在 dmesg 中看到 ttyUSB0 已打开且可用
我不是 C++ 人。这在我看来像是 g++ __libc_open64 代码的问题,但这似乎也不太可能。我不知道下一步该去哪里。任何建议将不胜感激。
收到的第一个 cmets 指向权限。在开始这个练习之前,我把 /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 设备,当我再次拔下/插入它时,它会消失并重新定义。 感谢您的帮助!
【问题讨论】:
-
不要在 dmesg 中寻找 ttyUSB0,检查文件 /dev/ttyUSB0 是否存在。在
open返回-1 之后,errno中的内容是什么? -
或者,在
strace下运行您的应用程序,它会自动为您检查返回码。我的钱在“Permission denied”上。