Una modifica del pin DTR può essere (eventualmente) evitata utilizzando la riga di comando
stty -F /dev/ttyUSB0 -hupcl
Questo ha l'effetto di attivare DTR; e successivamente quando la porta viene aperta e chiusa, il DTR non viene influenzato.
Fonte:https://raspberrypi.stackexchange.com/questions/9695/disable-dtr-on-ttyusb0/27706#27706
E c'è il codice lì per fare la stessa cosa da python tramite termios
, questo può essere fatto prima di aprire la porta tramite 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)
L'OP lo stava eseguendo su un Raspberry Pi, ma l'ho appena provato su Linux Mint su x86_64, ha funzionato. Non so come sia influenzato RTS.
Il motivo per cui lo trovo utile è per la comunicazione con un Arduino Nano - che ha un chip seriale USB-> a bordo - e normalmente l'Arduino viene ripristinato ogni volta che si apre la porta seriale da Linux (il fronte di salita del DTR provoca il ripristino). Per alcune applicazioni, questo non è un problema, ma è chiaramente utile evitarlo per altre applicazioni, e non è così facile rimuovere quel minuscolo condensatore dall'Arduino che collega il DTR per il ripristino.
Otterrai comunque un singolo ripristino quando viene eseguito il comando stty (dopo aver collegato il cavo USB). Ma almeno puoi continuare ad aprire e chiudere la porta seriale senza ulteriori ripristini.
Non ho idea del motivo per cui vorresti farlo, ma questo può essere fatto abbastanza facilmente modificando il driver del kernel Linux per la tua console seriale in modo che non attivi RTS. Ad esempio, per il driver della serie 8250 in drivers/tty/serial/8250/
puoi modificare ogni scrittura nel registro MCR (UART_MCR) per assicurarti che il bit 1 (la maschera è UART_MCR_RTS) non sia mai impostato.
Dal momento che è astratto nello spazio utente, sei sfortunato se vuoi farlo senza modificare il driver del kernel.
Avendo lo stesso problema, farei un tentativo patchando il ftdi_sio
driver del kernel. Devi solo decommentare una piccola parte di codice in ftdi_dtr_rts()
come questo:
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
}
e la linea di handshake RTS non viene più modificata al open()
call.Notare che uart potrebbe non funzionare più con l'handshake hardware RTS/CTS, a condizione che il driver del kernel modificato sia caricato. Ma puoi ancora controllare manualmente lo stato della linea di handshake RTS chiamando ad esempio:
int opins = TIOCM_RTS;
ioctl(tty_fd, TIOCMBIC, &opins);
L'ho testato con il Ctrl+A+G
comando di picocom 2.3a, che esegue Kubuntu 16.04 64 bit e adattatore uart USB basato su Ftdi FT2232H.
Potresti trovare maggiori dettagli su questo argomento qui.