串行接口永久拒绝请求

时间:2013-03-14 10:00:07

标签: serial-port

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

寻找此错误原因的另一个位置是什么?

感谢您的任何建议!

3 个答案:

答案 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中的所有内容都是文件。

因此,原则必须是有效的:找出正在使用设备的进程并将其停止(一旦拥有正确的进程标识符,pskill命令就会起作用。

如果以上所有情况都不是这样,那么可能你的方法是错误的。在这种情况下,我首先要仔细阅读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。重启后,设置了设备权限。