GNU/Linux >> Znalost Linux >  >> Linux

Jak otevřít sériový port v linuxu bez změny pinu?

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.


Linux
  1. Linux – sériový port Raspberrypi?

  2. Linux – Jak najít procesy pomocí sériového portu?

  3. Jak zkontrolovat otevřený port na vzdáleném systému Linux

  1. Jak změnit port SSH v Linuxu

  2. Jak otevřít, číst a zapisovat ze sériového portu v C?

  3. Jak otevřít port v Linuxu

  1. Jak otevřít Appimage v Linuxu

  2. Jak se připojit a odeslat data do sériového portu Bluetooth v systému Linux?

  3. Jak mohu sledovat data na sériovém portu v Linuxu?