2013-03-14 91 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。重新啓動後設置設備權限。