GNU/Linux >> Tutoriels Linux >  >> Linux

Comment ouvrir le port série sous Linux sans changer de broche ?

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.


Linux
  1. Comment changer le port SSH sous Linux

  2. Linux – Port série Raspberrypi ?

  3. Linux - Comment trouver des processus utilisant le port série ?

  4. Comment puis-je surveiller les données sur un port série sous Linux ?

  5. Comment ouvrir un port sous Linux

Comment vérifier qu'un port est ouvert sur un système Linux distant

Comment rechercher et fermer des ports ouverts sous Linux

Comment utiliser Netcat pour analyser les ports ouverts sous Linux

Comment envoyer un ping à un numéro de port sous Linux

Comment ouvrir une image ISO sans graver sur un disque sous Linux

Comment ouvrir un PDF dans un terminal Linux