我的实际问题是,每当我想访问我的串行接口(Arduino)时,系统都会返回 Permission denied 。
root@laptop:/home/user #> cu -l /dev/ttyACM0 -s 115200
/usr/bin/cu: open (/dev/ttyACM0): Permission denied
/usr/bin/cu: /dev/ttyACM0: Line in Use
root@laptop:/home/user #> ls -la /dev/ttyACM*
crw-rw---- 1 root dialout 166, 0 Mär 14 10:37 /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 Mär 14 10:37 /dev/ttyACM1
crw-rw---- 1 root dialout 166, 0 Mär 14 10:37 /dev/ttyACM2
crw-rw---- 1 root dialout 166, 0 Mär 14 10:37 /dev/ttyACM3
寻找此错误原因的另一个位置是什么?
感谢您的任何建议!
答案 0 :(得分:5)
我从未使用过Arduino,所以我认为你的方法是正确的。我要尝试的第一件事就是sudo
第一个命令:
sudo cu -l /dev/ttyACM0 -s 115200
但是,由于第二条消息是Line in Use
,因此/dev/ttyACM0
也可能已被实际占用/锁定。换句话说,是否有使用该端口的进程?我无法在串口上测试它,但我会尝试piping list open files命令的输出到grep命令:
lsof | grep ACM
应该列出锁定在端口上的进程的process identifer。然后,您可以使用kill命令停止该过程:
kill <PID_FROM_OUTPUT_OF_UPPER_COMMAND>
要验证您是否已成功停止该过程,您可以将list all active processes命令的输出通过管道传递给grep命令:
ps x | grep <PID_FROM_OUTPUT_OF_UPPER_COMMAND>
如果进程成功停止,则不返回任何输出。如果没有,它将输出该行,因此您可以尝试使用-9标志,如下所示:
kill -9 <PID_FROM_OUTPUT_OF_UPPER_COMMAND>
它最终会停止。
如果不进行测试,我不确定当前表单中写的lsof
命令是否会列出所采用的tty
设备。如果是这种情况,则必须有一些标记组合,它们将列出它们,因为Unix中的所有内容都是文件。
因此,原则必须是有效的:找出正在使用设备的进程并将其停止(一旦拥有正确的进程标识符,ps
和kill
命令就会起作用。
如果以上所有情况都不是这样,那么可能你的方法是错误的。在这种情况下,我首先要仔细阅读Arduino文档:)
答案 1 :(得分:1)
正如HappyHacking所提到的,你需要执行以下命令:
sudo adduser [user] dialout
然后注销用户并重新登录。
答案 2 :(得分:1)
我在/etc/udev/rules.d/51-arduino.rule中创建了新文件,内容如下:
SUBSYSTEMS=="usb", KERNEL=="ttyACM0", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0043", GROUP="dialout", MODE="0666"
小心正确设置idVendor和idProduct。重启后,设置了设备权限。