Perubahan pada pin DTR dapat (pada akhirnya) dihindari dengan menggunakan baris perintah
stty -F /dev/ttyUSB0 -hupcl
Ini memiliki efek menghidupkan DTR; dan selanjutnya saat port dibuka dan ditutup, DTR tidak terpengaruh.
Sumber:https://raspberrypi.stackexchange.com/questions/9695/disable-dtr-on-ttyusb0/27706#27706
Dan ada kode di sana untuk melakukan hal yang sama dari python melalui termios
, ini dapat dilakukan sebelum membuka port melalui 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 menjalankan ini di Raspberry Pi, tapi saya baru mencobanya di Linux Mint di x86_64, berhasil. Saya tidak tahu bagaimana RTS terpengaruh.
Alasan saya menemukan ini berguna, adalah untuk komunikasi dengan Arduino Nano - yang memiliki chip serial USB-> on board - dan biasanya Arduino diatur ulang setiap kali Anda membuka port serial dari linux (tepi DTR yang meningkat menyebabkan reset). Untuk beberapa aplikasi, ini bukan masalah, tetapi jelas berguna untuk menghindari ini untuk aplikasi lain, dan tidak mudah untuk melepaskan kapasitor kecil dari Arduino yang menghubungkan DTR untuk mengatur ulang.
Anda masih akan mendapatkan reset tunggal ketika perintah stty dijalankan (setelah mencolokkan kabel USB). Tapi setidaknya Anda dapat terus membuka dan menutup port serial setelah itu tanpa reset lebih lanjut.
Saya tidak tahu mengapa Anda ingin melakukan ini, tetapi ini dapat dilakukan dengan cukup mudah dengan memodifikasi driver kernel linux untuk konsol serial Anda sehingga tidak mengaktifkan RTS. Misalnya, untuk driver seri 8250 di drivers/tty/serial/8250/
Anda dapat mengubah setiap penulisan ke register MCR (UART_MCR) untuk memastikan bahwa bit 1 (mask adalah UART_MCR_RTS) tidak pernah disetel.
Karena diabstraksi di ruang pengguna, Anda kurang beruntung jika ingin melakukan ini tanpa memodifikasi driver kernel.
Memiliki masalah yang sama, saya akan mencobanya dengan menambal ftdi_sio
driver kernel. Anda hanya perlu menghapus sebagian kecil kode di ftdi_dtr_rts()
seperti ini:
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
}
dan garis jabat tangan RTS tidak lagi diubah setelah open()
call.Catatan, bahwa uart than mungkin tidak lagi bekerja dengan jabat tangan perangkat keras RTS/CTS, selama driver kernel yang dimodifikasi dimuat. Namun Anda masih dapat mengontrol status jalur jabat tangan RTS secara manual dengan memanggil mis.:
int opins = TIOCM_RTS;
ioctl(tty_fd, TIOCMBIC, &opins);
Saya telah menguji ini dengan Ctrl+A+G
perintah picocom 2.3a, menjalankan Kubuntu 16.04 64 bit dan adaptor usb uart berbasis Ftdi FT2232H.
Anda mungkin menemukan detail selengkapnya tentang topik ini di sini.