我正在尝试运行开发激光雷达单元(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:无此类文件或目录。
到目前为止,我在这里尝试消除明显的故障模式:
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。编译运行,没有区别
我已验证对:: open的调用返回了-1,这在紧随其后的代码中被视为失败
我在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设备时,它消失了并重新定义。 谢谢您的帮助!
strace将显示“权限被拒绝”的预测是正确的。我忘记了这不是固定的串行端口,而是USB到串行转换器。即使我更改了权限并验证了它是否可与Putty一起使用,但我忘记了重新启动或拔下USB后,/ dev / ttyUSB0设备会消失并在重新引导或插入时重新创建,这要求再次设置权限。