2013-03-14 63 views
4

我的实际问题是,每次我想访问我的串行接口(Arduino),系统都会返回权限被拒绝串行接口永久拒绝请求

[email protected]:/home/user #> cu -l /dev/ttyACM0 -s 115200 
/usr/bin/cu: open (/dev/ttyACM0): Permission denied 
/usr/bin/cu: /dev/ttyACM0: Line in Use 

[email protected]:/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

串口不能共享。找到使用该端口的其他程序并杀死它。 – 2013-03-14 11:36:07

回答

4

我从来没有使用过Arduino,所以我会假设你的方法是正确的。第一件事,我会尝试是sudo荷兰国际集团的第一个命令:

sudo cu -l /dev/ttyACM0 -s 115200 

但是,因为第二个消息是Line in Use它也可能是该/dev/ttyACM0已经实际拍摄/锁定。换句话说,有没有使用端口的进程?我无法测试它在串行端口上,但我想尝试pipinglist 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的文档:)开始

+0

在lsof中我没有得到任何文件。 用sudo启动cu也无济于事。 – HappyHacking 2013-03-14 11:33:52

+0

这是一个非常丑陋的建议,但可能会有所帮助:重置计算机 - 除非有人在启动或启动启动过程时使用该端口,否则将会起作用。如果这没有帮助,我可以给你的唯一建议是**仔细**重新阅读文档:) – linski 2013-03-14 11:39:48

+6

我发现问题:)即使你是root用户,你也不能访问这个设备。您必须是拨出组的成员!但感谢您的建议 – HappyHacking 2013-03-15 08:44:20

1

正如HappyHacking提到你需要执行下面的命令:

sudo adduser [user] dialout

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

1

我在/etc/udev/rules.d/51-arduino中创建了新文件。规则以下内容:

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

小心地正确设置idVendor和idProduct。重新启动后设置设备权限。