GNU/Linux >> Linux Esercitazione >  >> Linux

Come aprire la porta seriale in Linux senza modificare alcun pin?

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.


Linux
  1. Come modificare la porta SSH in Linux

  2. Come aprire Appimage in Linux

  3. Come controllare la porta aperta su un sistema Linux remoto

  4. Come aprire, leggere e scrivere dalla porta seriale in C?

  5. Come aprire la porta in Linux

Come verificare che una porta sia aperta su un sistema Linux remoto

Come trovare e chiudere le porte aperte in Linux

Come utilizzare Netcat per scansionare le porte aperte in Linux

Come eseguire il ping di un numero di porta in Linux

Come aprire l'immagine ISO senza masterizzare su disco in Linux

Come aprire un PDF in un terminale Linux