ドライバを使用してUSB経由でArduino Unoを接続しましたcdc_acm
。で見つけることができます/dev/ttyACM0
。
Arduinoシリアルインタフェースの規則は、DTR
統合シリアルUSBアダプタを使用するとき、またはRS-232ケーブルを使用するときにピン4または5などのリセット信号(DTR / RTS / DSR / CTS信号)を使用することです。 6または8)がRESET
ピンに接続されています。
このリセットアプローチの重要な利点は、そうでない場合本当に少なくともバンドの外では非常に近い-failsafeできる物理的に無効にすると(モデルに応じてコンデンサまたは抵抗をピンに接続してRESET
)、これによりこの重要なキルスイッチと関連するすべてのユーティリティが完全に破壊されます。
残念ながら、そうだ、現在Linuxはプログラムが何らかの理由でACMデバイスに接続されたときに常にこのシグナルを送信します。Windowsとは異なり、)これらの事が発生するのを防ぐために、あいまいに知られている信頼できる方法さえ提供していません。
(現在-hupcl
、「最後のプロセスが tty を閉じたときに切断信号を送信します。」そして-clocal
、「モデム制御信号の無効化」するいいえこの信号が送信されないようにブロック毎回デバイスは開いている.)
/dev/ttyACM0
tl;dr: DTR/RTS/DSR/CTS シグナルを送信せずに(ハードウェアレベルでシグナルをブロックすることを除く)、アクセス権を取得するにはどうすればよいですか。
ベストアンサー1
Linuxは、デフォルトでは、ユーザースペースプロセスがシリアルデバイス(/dev/ttyS0
または)を開いたときに/dev/ttyACM0
この行を生成し、閉じるとその行を削除します。DTR/RTS
dtr_rts
これは、ドライバ定義のコールバックを呼び出すことによって行われます。
残念ながら、この迷惑な動作を無効にすることができるsysctlまたは同様の機能はまだありません(現在はほとんど使用されていません)、唯一の方法はtty_port_operations
ドライバ構造からそのコールバックを削除してドライバモジュールを再コンパイルすることです。
cdc-acm
ドライバにコメントを付けてこれを行うことができます。この行:
--- drivers/usb/class/cdc-acm.c~
+++ drivers/usb/class/cdc-acm.c
@@ -1063,7 +1063,7 @@
}
static const struct tty_port_operations acm_port_ops = {
- .dtr_rts = acm_port_dtr_rts,
+ /* .dtr_rts = acm_port_dtr_rts, */
.shutdown = acm_port_shutdown,
.activate = acm_port_activate,
.destruct = acm_port_destruct,
これはいいえDTR/RTS
シリアルioctl(例えば、、TIOCMSET
)を介したワイヤの使用を防ぎますTIOCMBIC
。TIOCMBIS
acm_tty_tiocmset()
acm_ops
通常どおり、構造内でコールバックを待ちます。
同様のハッキングを他のドライバにも使用できます。私は個人的にPL2303
USB - >シリアルドライバと一緒に使用しました。
[違いは情報を提供することです。サイトがタブとスペースを分割するため、直接適用されません。]