4

私の実際の問題は、シリアルインターフェイス(Arduino)にアクセスするたびに、システムがPermissiondeniedを返すことです。

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

このエラーの理由で探すべき別の場所は何ですか?

アドバイスありがとうございます!

4

3 に答える 3

5

私はArduinoを使ったことがないので、あなたの方法は正しいと思います。私が最初に試みるsudoことは、最初のコマンドを実行することです。

sudo cu -l /dev/ttyACM0 -s 115200

ただし、2番目のメッセージは、がすでに実際に取得/ロックされてLine in Useいる可能性もあります。/dev/ttyACM0つまり、ポートを使用するプロセスはありますか?シリアルポートでテストすることはできませんが、 listopenfilesコマンドの出力をgrepコマンドにパイプしてみます。

lsof | grep ACM 

ポートをロックしたプロセスのプロセス識別子をリストする必要があります。次に、killコマンドを使用してそのプロセスを停止できます。

kill <PID_FROM_OUTPUT_OF_UPPER_COMMAND>

プロセスを正常に停止したことを確認するには、list allactiveprocessesコマンドの出力をgrepコマンドにパイプします。

ps x | grep <PID_FROM_OUTPUT_OF_UPPER_COMMAND>

プロセスが正常に停止した場合、出力は返されません。そうでない場合は、その行が出力されるため、次のように-9フラグを試してみることができます。

kill -9 <PID_FROM_OUTPUT_OF_UPPER_COMMAND>

そしてそれは最終的に停止します。

テストを行わないとlsof、現在のフォームに記述されているコマンドに、使用されているttyデバイスが一覧表示されるかどうかはわかりません。その場合、Unixのすべてがファイルであるため、それらをリストするフラグの組み合わせが必要です。

したがって、原則は有効である必要があります。デバイスを使用しているプロセスを見つけて停止します(適切なプロセス識別子を取得すると、psおよびkillコマンドが機能します)。

上記のすべてが当てはまらない場合は、おそらくあなたの方法が間違っています。その場合は、Arduinoのドキュメントをもう一度注意深く読み直すことから始めます:)

于 2013-03-14T11:09:53.570 に答える
1

HappyHackingが述べたように、次のコマンドを実行する必要があります。

sudo adduser [user] dialout

次に、ユーザーからログアウトして、再度ログインします。

于 2014-12-06T19:04:39.860 に答える
1

/etc/udev/rules.d/51-arduino.ruleに次の内容の新しいファイルを作成しました。

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

idVendorとidProductを正しく設定するように注意してください。再起動後、デバイスの権限が設定されます。

于 2015-09-01T17:37:27.540 に答える