4

我的实际问题是,每次我想访问我的串行接口(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

由于此错误,要寻找的另一个位置是什么?

感谢您的任何建议!

4

3 回答 3

5

我从未使用过 Arduino,所以我认为您的方法是正确的。我会尝试的第一件事是sudo执行第一个命令:

sudo cu -l /dev/ttyACM0 -s 115200

但是,由于第二条消息是Line in Use,它也可能/dev/ttyACM0实际上已经被占用/锁定。换句话说,是否有任何进程使用该端口?我无法在串行端口上对其进行测试,但我会尝试将list open files命令的输出通过管道传输到grep命令:

lsof | grep ACM 

应该列出锁定在端口上的进程的进程标识符。然后您可以使用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 中的所有内容都是一个文件。

因此,原则必须有效:找出哪个进程正在使用该设备并停止它(一旦您拥有正确的进程标识符, psand命令将起作用)。kill

如果以上所有情况都不是,那么您的方法可能是错误的。在这种情况下,我会先仔细重新阅读 Arduino 文档 :)

于 2013-03-14T11:09:53.570 回答
1

正如 HappyHacking 提到的,您需要执行以下命令:

sudo adduser [user] dialout

然后注销用户并重新登录。

于 2014-12-06T19:04:39.860 回答
1

我在 /etc/udev/rules.d/51-arduino.rule 中创建了具有以下内容的新文件:

SUBSYSTEMS=="usb", KERNEL=="ttyACM0", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0043", GROUP="dialout", MODE="0666"

注意正确设置 idVendor 和 idProduct。重新启动后设置设备权限。

于 2015-09-01T17:37:27.540 回答