串行接口永久拒绝请求

Hap*_*ing 4 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
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的建议!

lin*_*ski 5

我从未使用过Arduino,所以我认为你的方法是正确的.我要尝试的第一件事是sudo第一个命令:

sudo cu -l /dev/ttyACM0 -s 115200
Run Code Online (Sandbox Code Playgroud)

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

lsof | grep ACM 
Run Code Online (Sandbox Code Playgroud)

它应该列出锁定在端口上的进程的进程标识符.然后,您可以使用kill命令来停止该进程:

kill <PID_FROM_OUTPUT_OF_UPPER_COMMAND>
Run Code Online (Sandbox Code Playgroud)

要验证您是否已成功停止该进程,可以将list all active processes命令的输出通过管道传递给grep命令:

ps x | grep <PID_FROM_OUTPUT_OF_UPPER_COMMAND>
Run Code Online (Sandbox Code Playgroud)

如果进程成功停止,则不应返回任何输出.如果没有,它将输出该行,因此您可以尝试使用-9标志,如下所示:

kill -9 <PID_FROM_OUTPUT_OF_UPPER_COMMAND>
Run Code Online (Sandbox Code Playgroud)

它最终会停止.

没有测试,我不确定lsof以当前形式编写的命令是否会列出所采用的tty设备.如果是这种情况,则必须有一些标记组合,它们将列出它们,因为Unix中的所有内容都是文件.

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

如果以上所有情况都不是这样,那么可能你的方法是错误的.在这种情况下,我首先要仔细阅读Arduino文档:)

  • 我发现了问题:)即使您是root用户,也不允许访问此设备.您必须是拨出组的成员!但感谢您的建议 (6认同)