Změně pinu DTR se lze (nakonec) vyhnout pomocí příkazového řádku
stty -F /dev/ttyUSB0 -hupcl
To má za následek zapnutí DTR; a následně, když je port otevřen a zavřen, DTR není ovlivněno.
Zdroj:https://raspberrypi.stackexchange.com/questions/9695/disable-dtr-on-ttyusb0/27706#27706
A je tam kód, který udělá to samé z pythonu přes termios
, to lze provést před otevřením portu pomocí 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 to spustil na Raspberry Pi, ale právě jsem to zkoušel na Linux Mint na x86_64, fungovalo to. Nevím, jak je RTS ovlivněno.
Důvod, proč to považuji za užitečné, je komunikace s Arduino Nano - který má na desce USB-> sériový čip - a normálně se Arduino resetuje pokaždé, když otevřete sériový port z linuxu (vzestupná hrana DTR způsobí reset). Pro některé aplikace to není problém, ale je jasné, že je užitečné se tomu vyhnout u jiných aplikací a není tak snadné odstranit ten malý kondenzátor z Arduina, který připojuje DTR k resetování.
Po provedení příkazu stty (po připojení USB kabelu) stále dostanete jeden reset. Ale alespoň pak můžete dál otevírat a zavírat sériový port bez dalších resetů.
Nemám ponětí, proč byste to chtěli udělat, ale lze to udělat docela snadno úpravou ovladače linuxového jádra pro vaši sériovou konzoli tak, aby se nepřepínalo RTS. Například pro ovladač řady 8250 v drivers/tty/serial/8250/
můžete změnit každý zápis do registru MCR (UART_MCR), abyste zajistili, že bit 1 (maska je UART_MCR_RTS) nebude nikdy nastaven.
Protože je to v uživatelském prostoru abstrahováno, máte smůlu, pokud to chcete udělat bez úpravy ovladače jádra.
Mám stejný problém, zkusil bych to záplatou ftdi_sio
ovladač jádra. Stačí odkomentovat malý kousek kódu v ftdi_dtr_rts()
takhle:
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
}
a linka handshake RTS se po open()
již nemění call.Všimněte si, že uart již nemusí fungovat s hardwarovým handshake RTS/CTS, pokud je načten váš upravený ovladač jádra. Stále však můžete ovládat stav RTS handshake linky ručně zavoláním např.:
int opins = TIOCM_RTS;
ioctl(tty_fd, TIOCMBIC, &opins);
Testoval jsem to s Ctrl+A+G
příkaz picocom 2.3a se systémem Kubuntu 16.04 64bit a adaptérem usb uart založeným na Ftdi FT2232H.
Další podrobnosti k tomuto tématu můžete najít zde.