GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie öffne ich die serielle Schnittstelle unter Linux, ohne einen Pin zu ändern?

Eine Änderung des DTR-Pins kann (eventuell) über die Kommandozeile vermieden werden

stty -F /dev/ttyUSB0 -hupcl

Dies bewirkt, dass DTR eingeschaltet wird; und anschließend, wenn der Port geöffnet und geschlossen wird, ist DTR nicht betroffen.

Quelle:https://raspberrypi.stackexchange.com/questions/9695/disable-dtr-on-ttyusb0/27706#27706

Und es gibt dort Code, um dasselbe von Python über termios zu tun , kann dies vor dem Öffnen des Ports über pyserial:

erfolgen
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)

Das OP lief auf einem Raspberry Pi, aber ich habe es gerade unter Linux Mint auf x86_64 ausprobiert, es hat funktioniert. Ich weiß nicht, wie RTS davon betroffen ist.

Der Grund, warum ich das nützlich finde, ist die Kommunikation mit einem Arduino Nano - der einen USB-> seriellen Chip an Bord hat - und normalerweise wird der Arduino jedes Mal zurückgesetzt, wenn Sie die serielle Schnittstelle von Linux öffnen (eine steigende Flanke von DTR verursacht einen Reset). Für einige Anwendungen ist dies kein Problem, aber es ist eindeutig nützlich, dies für andere Anwendungen zu vermeiden, und es ist nicht so einfach, diesen winzigen Kondensator aus dem Arduino zu entfernen, der DTR mit Reset verbindet.

Sie erhalten immer noch einen einzelnen Reset, wenn der stty-Befehl ausgeführt wird (nach dem Einstecken des USB-Kabels). Aber zumindest können Sie danach ohne weitere Resets die serielle Schnittstelle öffnen und schließen.


Ich habe keine Ahnung, warum Sie dies tun möchten, aber dies kann ziemlich einfach erreicht werden, indem Sie den Linux-Kernel-Treiber für Ihre serielle Konsole so ändern, dass RTS nicht umgeschaltet wird. Zum Beispiel für den Treiber der Serie 8250 in drivers/tty/serial/8250/ Sie könnten jeden Schreibvorgang in das MCR-Register (UART_MCR) ändern, um sicherzustellen, dass Bit 1 (Maske ist UART_MCR_RTS) niemals gesetzt wird.

Da es im Userspace abstrahiert ist, haben Sie Pech, wenn Sie dies tun wollen, ohne den Kernel-Treiber zu modifizieren.


Da ich das gleiche Problem habe, würde ich es versuchen, indem ich ftdi_sio patche Kernel-Treiber. Sie müssen nur ein kleines Stück Code in ftdi_dtr_rts() auskommentieren so:

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
}

und die RTS-Handshake-Leitung wird bei open() nicht mehr geändert call.Beachten Sie, dass der uart dann möglicherweise nicht mehr mit RTS/CTS-Hardware-Handshake funktioniert, solange Ihr modifizierter Kernel-Treiber geladen ist. Sie können den Status der RTS-Handshake-Leitung jedoch immer noch manuell steuern, indem Sie z. B.:

aufrufen
    int opins = TIOCM_RTS;
    ioctl(tty_fd, TIOCMBIC, &opins);

Ich hatte das mit dem Ctrl+A+G getestet Befehl von picocom 2.3a, auf dem Kubuntu 16.04 64 Bit und ein Ftdi FT2232H-basierter USB-UART-Adapter ausgeführt werden.

Weitere Details zu diesem Thema finden Sie hier.


Linux
  1. So ändern Sie den SSH-Port unter Linux

  2. So öffnen Sie Appimage unter Linux

  3. Wie verbinde und sende ich Daten an einen seriellen Bluetooth-Port unter Linux?

  4. Wie kann ich Daten an einer seriellen Schnittstelle in Linux überwachen?

  5. Wie kann ich von der seriellen Schnittstelle in C öffnen, lesen und schreiben?

So überprüfen Sie, ob ein Port auf einem Remote-Linux-System geöffnet ist

So finden und schließen Sie offene Ports in Linux

So verwenden Sie Netcat zum Scannen offener Ports in Linux

So pingen Sie eine Portnummer in Linux an

So öffnen Sie ein ISO-Image, ohne es unter Linux auf Disc zu brennen

So öffnen Sie eine PDF-Datei im Linux-Terminal