DTR ピンの変更は、コマンド ラインを使用して (最終的には) 回避できます
stty -F /dev/ttyUSB0 -hupcl
これには、DTR をオンにする効果があります。その後、ポートが開閉されても、DTR は影響を受けません。
ソース:https://raspberrypi.stackexchange.com/questions/9695/disable-dtr-on-ttyusb0/27706#27706
termios
経由で Python から同じことを行うコードがあります。 、これは pyserial 経由でポートを開く前に行うことができます:
import termios
path = '/dev/ttyACM0'
# Disable reset after hangup
with open(path) as f:
attrs = termios.tcgetattr(f)
attrs[2] = attrs[2] & ~termios.HUPCL
termios.tcsetattr(f, termios.TCSAFLUSH, attrs)
OPはこれをRaspberry Piで実行していましたが、x86_64のLinux Mintで試してみたところ、うまくいきました。 RTS がどのように影響を受けるかわかりません。
これが便利だと思う理由は、Arduino Nano(USB->シリアルチップが搭載されている)との通信のためであり、通常、Linuxからシリアルポートを開くたびにArduinoがリセットされます(DTRの立ち上がりエッジでリセットされます)。一部のアプリケーションではこれは問題ではありませんが、他のアプリケーションではこれを回避することが明らかに有用であり、DTR をリセットに接続する Arduino からその小さなコンデンサを取り外すのはそれほど簡単ではありません。
stty コマンドを実行すると (USB ケーブルを接続した後)、単一のリセットが行われます。ただし、少なくとも、その後はリセットせずにシリアルポートを開閉し続けることができます。
なぜこれを行う必要があるのか わかりませんが、シリアルコンソールのLinuxカーネルドライバーを変更してRTSを切り替えないようにすることで、非常に簡単に実行できます。たとえば、drivers/tty/serial/8250/
の 8250 シリーズ ドライバーの場合 MCR レジスタ (UART_MCR) へのすべての書き込みを変更して、ビット 1 (マスクは UART_MCR_RTS) が設定されないようにすることができます。
これはユーザー空間で抽象化されているため、カーネル ドライバーを変更せずにこれを行いたい場合は不運です。
同じ問題があるので、 ftdi_sio
にパッチを当てて試してみます カーネルドライバー。 ftdi_dtr_rts()
の小さなコードのコメントを外すだけです。 このように:
static void ftdi_dtr_rts(struct usb_serial_port *port, int on) {
...
/* drop RTS and DTR */
if (on)
set_mctrl(port, TIOCM_DTR /*| TIOCM_RTS*/); // <<-- HERE
else
clear_mctrl(port, TIOCM_DTR /*| TIOCM_RTS*/); // <<-- and HERE
}
RTS ハンドシェイク行は open()
で変更されなくなりました 変更したカーネル ドライバーがロードされている限り、uart は RTS/CTS ハードウェア ハンドシェイクで動作しなくなる可能性があることに注意してください。ただし、次のように呼び出して、RTS ハンドシェイク ラインの状態を手動で制御することもできます。
int opins = TIOCM_RTS;
ioctl(tty_fd, TIOCMBIC, &opins);
Ctrl+A+G
でこれをテストしました Picocom 2.3a のコマンド、Kubuntu 16.04 64 ビットおよび Ftdi FT2232H ベースの USB uart アダプターを実行します。
このトピックの詳細については、こちらをご覧ください。