我的实际问题是,每次我想访问我的串行接口(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)
寻找此错误原因的另一个位置是什么?
谢谢你的建议!
我从未使用过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文档:)
| 归档时间: |
|
| 查看次数: |
7196 次 |
| 最近记录: |