Un changement dans la broche DTR peut être (éventuellement) évité en utilisant la ligne de commande
stty -F /dev/ttyUSB0 -hupcl
Cela a pour effet d'activer le DTR ; et par la suite lorsque le port est ouvert et fermé, le DTR n'est pas affecté.
Source :https://raspberrypi.stackexchange.com/questions/9695/disable-dtr-on-ttyusb0/27706#27706
Et il y a du code pour faire la même chose depuis python via termios
, cela peut être fait avant d'ouvrir le port via 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 l'exécutait sur un Raspberry Pi, mais je viens de l'essayer sur Linux Mint sur x86_64, cela a fonctionné. Je ne sais pas comment RTS est affecté.
La raison pour laquelle je trouve cela utile, c'est pour la communication avec un Arduino Nano - qui a une puce USB-> série à bord - et normalement l'Arduino est réinitialisé chaque fois que vous ouvrez le port série depuis Linux (le front montant de DTR provoque la réinitialisation). Pour certaines applications, ce n'est pas un problème, mais il est clairement utile d'éviter cela pour d'autres applications, et il n'est pas si facile de retirer ce minuscule condensateur de l'Arduino qui connecte le DTR à réinitialiser.
Vous obtiendrez toujours une seule réinitialisation lorsque la commande stty sera exécutée (après avoir branché le câble USB). Mais au moins, vous pouvez ensuite continuer à ouvrir et à fermer le port série sans autre réinitialisation.
Je ne sais pas pourquoi vous voudriez faire cela, mais cela peut être fait assez facilement en modifiant le pilote du noyau Linux pour votre console série afin qu'il ne bascule pas RTS. Par exemple, pour le pilote de la série 8250 dans drivers/tty/serial/8250/
vous pouvez modifier chaque écriture dans le registre MCR (UART_MCR) pour vous assurer que le bit 1 (le masque est UART_MCR_RTS) n'est jamais défini.
Comme il est abstrait dans l'espace utilisateur, vous n'avez pas de chance si vous souhaitez le faire sans modifier le pilote du noyau.
Ayant le même problème, je ferais un essai en patchant le ftdi_sio
pilote du noyau. Il vous suffit de décommenter un petit bout de code en ftdi_dtr_rts()
comme ceci :
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
}
et la ligne de poignée de main RTS n'est plus modifiée sur open()
call.Notez que l'uart peut ne plus fonctionner avec la poignée de main matérielle RTS/CTS, tant que votre pilote de noyau modifié est chargé. Mais vous pouvez toujours contrôler manuellement l'état de la ligne de prise de contact RTS en appelant par exemple :
int opins = TIOCM_RTS;
ioctl(tty_fd, TIOCMBIC, &opins);
J'avais testé cela avec le Ctrl+A+G
commande de picocom 2.3a, exécutant Kubuntu 16.04 64 bits et adaptateur uart usb basé sur Ftdi FT2232H.
Vous trouverez peut-être plus de détails sur ce sujet ici.