Wie verbinde ich mich mit einem seriellen Port so einfach wie mit SSH?

86

Gibt es eine Möglichkeit, eine Verbindung zu einem seriellen Terminal herzustellen, wie Sie es mit SSH tun würden? Es muss einen einfacheren Weg geben als solche Tools wie Minicom

$ serial /dev/ttyS0 

Ich weiß, dass ich catdie Ausgabe von kann, /dev/ttyS0aber auf diese Weise ist nur eine Art der Kommunikation möglich, vom Port zur Konsole. Und echoraus zum Hafen ist genauso, aber umgekehrt, zum Hafen.

Wie kann ich unter Unix / Linux auf einfachste Weise eine bidirektionale Kommunikation mit einer seriellen Schnittstelle realisieren?

ihatetoregister
quelle
2
Tolle Antworten Leute !. Leider scheint niemand meinen Zweck zu erfüllen, wenn ich mit eingebetteten Systemen mit einer begrenzten Anzahl von Befehlen arbeite. Ich habe jedoch einen anderen Weg gefunden, einen Shell-Scrip zu verwenden, den ich als eine der Antworten auf meine Frage hinzufüge.
ihatetoregister

Antworten:

69

Ich finde screendas nützlichste Programm für die serielle Kommunikation, da ich es sowieso für andere Dinge verwende. Dies ist normalerweise nur screen /dev/ttyS0 <speed>der Fall, obwohl die Standardeinstellungen für Ihr Gerät möglicherweise unterschiedlich sind. Sie können auch alles in die Sitzung leiten, indem Sie in den Befehlsmodus wechseln und tun exec !! <run some program that generates output>.

Shawn J. Goff
quelle
3
+1 für Bildschirm! Siehe auch: serverfault.com/q/81544/11086
Josh,
1
Siehe auch noah.org/wiki/Screen_notes#using_screen_as_a_serial_terminal und die Manualpage stty (1), ich musste zusätzliche Optionen hinzufügen (zB Parität), damit es funktioniert.
Lekensteyn
3
schäme mich Ich habe den TX / RX falsch angeschlossen: o
Lekensteyn
screenist großartig, aber ich denke nicht, dass es einfacher ist als minicom:-)
Ciro Santilli
1
@CiroSantilli Screen 刘晓波 死 事件 事件 - Bildschirm ist vielleicht nicht einfacher als Minicom, aber da ich bereits Bildschirm verwende, ist es für mich weniger kompliziert, meine Serienprodukte mit Bildschirm zu erstellen, sodass Minicom nicht mehr benötigt wird.
Yeti
48

Hintergrund

Der Hauptgrund, warum Sie ein Programm minicomfür die Kommunikation über eine serielle Schnittstelle benötigen, ist, dass die Schnittstelle eingerichtet werden muss, bevor eine Verbindung hergestellt werden kann. Wenn es nicht richtig eingerichtet wäre , würden die Befehle catund echonicht das tun, was Sie erwartet hätten. Beachten Sie minicom, dass der Port mit den verwendeten Einstellungen belassen wird , sobald Sie ein Programm wie dieses ausführen minicom. Sie können die Kommunikationseinstellungen mit dem sttyProgramm wie folgt abfragen :

stty < /dev/ttyS0

Wenn Sie es richtig gemacht haben; Nach dem Booten des Computers und vor dem Ausführen eines anderen Programms werden minicom,die Kommunikationseinstellungen auf die Standardeinstellungen zurückgesetzt. Diese unterscheiden sich wahrscheinlich von denen, die Sie für die Herstellung Ihrer Verbindung benötigen. In dieser Situation führt das Senden der Befehle catoder echoan den Port entweder zu Müll oder funktioniert überhaupt nicht.

Führen Sie das Programm nach der Verwendung sttyerneut ausminicom , und Sie werden feststellen, dass die Einstellungen auf die vom Programm verwendeten Werte eingestellt sind.

Minimale serielle Kommunikation

Grundsätzlich sind zwei Dinge erforderlich, um eine bidirektionale Kommunikation über einen seriellen Port zu ermöglichen: 1) Konfigurieren des seriellen Ports und 2) Öffnen des Pseudotty-Lese- / Schreibzugriffs.

Das grundlegendste Programm, von dem ich weiß, dass es das tut, ist picocom. Sie können auch ein Tool verwenden setserial, um den Port einzurichten und dann direkt über die Shell mit ihm zu interagieren.

rozcietrzewiacz
quelle
5
picocomAußerdem können Sie eine Verbindung zu einem seriellen Anschluss herstellen, ohne ihn neu zu konfigurieren ( --noinit), und das Programm beenden, ohne die Konfiguration des seriellen Anschlusses wiederherzustellen ( --noresetoder mit Ctrl-A/ Ctrl-Qzu beenden picocom). Ich habe festgestellt picocom, dass es viel einfacher zu bedienen ist als minicom. Aus Gründen, die ich nicht herausgefunden habe, sendet oder empfängt minicom manchmal einfach keine Daten an einem Port, der kurz zuvor funktioniert hat oder mit dem picocom keine Probleme hat. Es ist wahrscheinlich eine arkane Konfigurationsoption, aber was auch immer es ist, ich kann es nicht herausfinden (und dieses Verhalten ist auf mehr als einem Computer aufgetreten).
Michael Burr
+1 für Picocom! Ich stellte fest, dass ich keine Befehle ohne die richtigen Zeilenenden auf das serielle Gerät schreiben konnte: Ich musste --omap crcrlf --echoOptionen verwenden
user2561747
24

Wenn UUCP auf dem System installiert ist, können Sie den Befehl cu verwenden , z

 $ cu -l /dev/ttyS0 -s 9600
ktf
quelle
Verwenden Sie ~^Doder ~.zum Verlassen.
Iman
24

Ich fand einen Weg , einen Shell - Skript hier , die setzten catals Hintergrundprozess und eine while - Schleife, die die Benutzereingabe lesen und echoes an dem Port aus. Ich habe es allgemeiner modifiziert und es passte perfekt zu meinem Zweck.

#!/bin/sh

# connect.sh

# Usage:
# $ connect.sh <device> <port speed>
# Example: connect.sh /dev/ttyS0 9600

# Set up device
stty -F $1 $2

# Let cat read the device $1 in the background
cat $1 &

# Capture PID of background process so it is possible to terminate it when done
bgPid=$!

# Read commands from user, send them to device $1
while read cmd
do
   echo "$cmd" 
done > $1

# Terminate background read process
kill $bgPid
ihatetoregister
quelle
1
Außerdem habe ich unten eine leicht modifizierte Version erstellt, die auch Strg + C und Strg + Z senden kann.
Fritz
@Fritz Schöne Entdeckung! Also, wenn ich das richtig verstehe, würde der Hintergrundprozess niemals abgebrochen, weil $? scheint sich nicht zu etwas auszudehnen, oder?
ihatetoregister
1
@ihatetoregister: Nicht ganz richtig. Der Hintergrundprozess wird abgebrochen, jedoch nicht aus den erwarteten Gründen. $?Wird auf den Exit-Code des letzten Befehls ohne Hintergrund erweitert (in diesem Fall stty -F $1 $2), sodass er auf 0 erweitert wird, wenn kein Fehler aufgetreten ist. So wird die letzte Zeile, kill 0die wiederum die aktuelle Shell und alle ihre untergeordneten Objekte zu töten scheint (in interaktiven Shells verhält es sich meiner Meinung nach anders). Für alle Details siehe die folgende Erklärung: unix.stackexchange.com/questions/67532/…
Fritz
1
Der eigentliche Nachteil in Ihrem Skript ist jedoch, dass der Hintergrundprozess nur beendet wird , wenn Sie Strg + D drücken, um Ihr Skript zu beenden, da dies die whileSchleife sauber beendet. Wenn Sie es mit Strg + C oder mit dem killBefehl catbeenden, bleibt der Prozess am Leben. Um das zu beheben, müssten Sie den trapBefehl verwenden, um ihn auszuführen, kill $bgPidwenn die Shell beendet wird, wie es mein Skript unten tut . Ehrlich gesagt hätte ich nichts dagegen, wenn Sie einfach mein gesamtes Skript zu Ihrem Beitrag hinzugefügt hätten. Das habe ich versucht, aber die Bearbeitung wurde abgelehnt.
Fritz
Könnten Sie bitte klarstellen, wo die Verbindung zustande kommt, da dies in Ihrer Antwort
auskommentiert ist
14

Versuchen Sie es unter http://tio.github.io

"tio" ist eine einfache TTY-Terminalanwendung, die über eine einfache Befehlszeilenschnittstelle verfügt, über die eine einfache Verbindung zu TTY-Geräten für die grundlegende Eingabe / Ausgabe hergestellt werden kann.

Typische Verwendung ist ohne Optionen. Zum Beispiel:

tio /dev/ttyS0

Welches entspricht den häufig verwendeten Optionen:

tio --baudrate 115200 --databits 8 --flow none --stopbits 1 --parity none /dev/ttyS0

Es wird mit vollständiger Unterstützung für die automatische Vervollständigung der Shell für alle Optionen geliefert.

Martin
quelle
3
Ich verwende msys2Windows und Sie können installieren tiomit , pacman -S tioweil es standardmäßig unter den verfügbaren Paketen ist. screen, picocomusw. sind es nicht. Vielen Dank!
Kohányi Róbert
12

Dieses Skript basiert auf einer anderen Antwort , sendet jedoch alles über die serielle Schnittstelle (außer Strg + Q), nicht nur einzelne Befehle, gefolgt von Enter. Dies ermöglicht es Ihnen, Strg + C oder Strg + Z auf dem Remote-Host zu verwenden und interaktive "GUI" -Programme wie aptitude oder alsamixer zu verwenden. Es kann durch Drücken von Strg + Q beendet werden.

#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo "Usage:"
    echo "  femtocom <serial-port> [ <speed> [ <stty-options> ... ] ]"
    echo "  Example: $0 /dev/ttyS0 9600"
    echo "  Press Ctrl+Q to quit"
fi

# Exit when any command fails
set -e

# Save settings of current terminal to restore later
original_settings="$(stty -g)"

# Kill background process and restore terminal when this shell exits
trap 'set +e; kill "$bgPid"; stty "$original_settings"' EXIT

# Remove serial port from parameter list, so only stty settings remain
port="$1"; shift

# Set up serial port, append all remaining parameters from command line
stty -F "$port" raw -echo "$@"

# Set current terminal to pass through everything except Ctrl+Q
# * "quit undef susp undef" will disable Ctrl+\ and Ctrl+Z handling
# * "isig intr ^Q" will make Ctrl+Q send SIGINT to this script
stty raw -echo isig intr ^Q quit undef susp undef

# Let cat read the serial port to the screen in the background
# Capture PID of background process so it is possible to terminate it
cat "$port" & bgPid=$!

# Redirect all keyboard input to serial port
cat >"$port"
Fritz
quelle
7

Übrigens enthält das Putty-Paket (das unter Linux ausgeführt wird) serielle Unterstützung.

mdpc
quelle
4

Ein weiteres Problem, das auftreten kann, ist, dass Ihr Benutzerkonto möglicherweise auf die Gruppe "Einwählen" festgelegt werden muss, um auf den seriellen Anschluss zuzugreifen.

sudo usermod -a -G dialout $USER
dfowler7437
quelle
3

Putty funktioniert gut unter Linux und bietet einige Vorteile, insbesondere für die serielle Kommunikation. Es hat einen Nachteil, den ich nicht direkt lösen konnte: Kein Kopieren und Einfügen aus dem Putty-Fenster. Die Windows-Version hat eine schöne Funktion zum automatischen Kopieren in die Zwischenablage bei Hervorhebung, Rechtsklick zum Einfügen (und es gibt ausgezeichnete Plugins für Chrome und Firefox, um das gleiche Verhalten zu ermöglichen), aber unter Linux wird AFAIK nicht geliebt.

Wenn das Fehlen einer Kopie ein Problem ist (es ist für mich), # tail -f putty.logaktivieren Sie die Anmeldemethode und öffnen Sie ein Standard-Terminalfenster. Für die Standard-Copypasta-Aktion steht bidirektionaler Text zur Verfügung.

Gefäß
quelle
1
Ich finde, dass Putty unter Linux nicht "die Zwischenablage" einfügt (was Sie mit Control-C kopieren), sondern "die primäre Auswahl" (was Sie aktuell in einem Programm ausgewählt haben) mit der mittleren Maus. Ebenso können Sie Zeichen in Puttys Bildschirm auswählen, um die primäre Auswahl zu definieren. Wenn ich jedoch möchte, dass Text von einem Putty-Bildschirm auf eine VM übertragen wird, muss es sich um die Zwischenablage handeln. Daher muss ich ein Zwischenprogramm verwenden, um den Text aus der Hauptauswahl zu empfangen und in die Zwischenablage zu kopieren.
Cardiff Space Man
3

Wie bereits erwähnt, können Sie Picocom ausprobieren. Das neueste Release (2.0) kann auch (sicher) zum Einrichten eines "Terminalservers" verwendet werden, da es keine Shell-Befehlsinjektion mehr zulässt. Sehen:

https://github.com/npat-efault/picocom/releases

Nick Patavalis
quelle
2

Es hängt davon ab, was Sie tun möchten. Möchten Sie eine Shell oder Anwendung interaktiv vom Terminal aus ausführen, über die serielle Leitung eine Verbindung zu einem anderen Computer herstellen und die Kommunikation mit einem Gerät über eine serielle Schnittstelle automatisieren?

Wenn Sie bidirektionale Kommunikation möchten, möchten Sie vermutlich etwas Interaktives mit einem Menschen auf dem Terminal. Sie können das System so konfigurieren, dass Anmeldungen von einem Terminal über einen seriellen Port zugelassen werden, indem Sie eine getty (1) -Sitzung auf dem seriellen Port einrichten. Getty ist das Tool zum Einrichten eines Terminals und zum Zulassen von Anmeldungen darauf. Fügen Sie einen Eintrag in Ihre inittab (5) -Datei ein, um ihn auf der entsprechenden seriellen Schnittstelle auszuführen respawn.

Wenn Sie eine Verbindung zu einem Gerät herstellen und automatisierte bidirektionale Konversationen initiieren möchten, können Sie feststellen, ob Sie mit der Erwartung das bekommen, was Sie wollen. Verwenden Sie stty (1) , um den Port auf die richtige Parität, Baudrate und andere relevante Einstellungen zu konfigurieren.

Wenn Sie über die serielle Schnittstelle interaktiv mit einem anderen Computer kommunizieren möchten, benötigen Sie eine Terminalemulationssoftware. Dies macht eine ganze Menge aus - es richtet den Port ein, interpretiert ANSI oder andere Terminalbefehlssequenzen (ANSI war bei weitem nicht der einzige Standard, der von seriellen Terminals unterstützt wird). Viele Terminalemulatoren unterstützen auch Dateiübertragungsprotokolle wie Kermit oder Zmodem.

Die Ein- und Ausgänge der seriellen Kommunikation und der Terminal-E / A sind recht komplex. Im seriellen Howto können Sie mehr lesen, als Sie jemals zu diesem Thema wissen wollten.

Betroffen vonTunbridgeWells
quelle
1

Vielleicht möchten Sie einen Blick darauf werfen

http://serialconsole.sourceforge.net

Pro: hat keine offensichtliche Sicherheitsprobleme wie minicom oder picocom (wenn Sie die Benutzer - Shell - Zugang, kein Problem geben nicht ein Problem haben, aber Sie wahrscheinlich tun ein, wenn Sie einen Terminalserver einrichten möchten ... )

Peter
quelle
1

Sie müssen sicher sein, dass Sie über die richtigen Lese- und Schreibberechtigungen für das Gerät verfügen. Diese können Sie folgendermaßen anzeigen:

$ls -l /dev/[serial device]

Ich verlasse mich auf das Skript, das Sie gefunden und einige Änderungen vorgenommen haben.

Für die Entwicklungssysteme, die ich bisher verwendet habe, brauchten sie:

  • Keine Parität und
  • Ein Stoppbit

Diese Werte sind die Standardwerte im Skript.

Um eine Verbindung herzustellen, können Sie sie wie folgt verwenden:

./connect.sh /dev/[serial device] [baud speed]

Beispiel:

$./connect.sh /dev/ttyUSB0 19200

Skript:

#!/bin/bash

# connect.sh


#Taken from example modified by: ihatetoregister
# On stack exchange, thread:
# http://unix.stackexchange.com/questions/22545/how-to-connect-to-a-serial-port-as-simple-as-using-ssh
# Modified by Rafael Karosuo <[email protected]>
#   - parity enabling and amount of stop bits
#   - no execution without minimum params
#   - exit code for stty
#   - bgPid fix, used $! instead of $? to take the PID of cat proc in background.
#   - exit command to end the program
#   - CR termination and strip of NL added by READ command, in order to make $cmd\r\n format instead of \n$cmd\n


# Usage:
# $./connect.sh <device> <port speed> [# Stop bits] [parity]

# Stop bits 1|2
# Parity even | odd

# If no last two params, then default values stopbits=1, parity=disab

# Example: 
# connect.sh /dev/ttyS0 9600 1 even, this will use 1 stop bit and even parity
# connect.sh /dev/ttyS0 9600, this will take default values for parity and stopbit


#Check if at least port and baud params provided
if [ -z "$1" ] || [ -z "$2" ]; then
    printf "\nusage: ./connect.sh <device> <port speed> [# Stop bits 1|2] [parity even|odd]\n\tNeed to provide at least port and baud speed parameters.\n\texample:connect.sh /dev/ttyS0 9600\n\n"
    exit 1;
else
    case "$3"   in
        2) stopb="cstopb";;
        *) stopb="-cstopb";;
    esac

    if [ "$4" = "even" ]; then
        par="-parodd"
    elif [ "$4" = "odd" ]; then
        par="parodd"
    else
        par="-parity"
    fi
    printf "\nThen stty -F $1 $2 $stopb $par\n";
fi

# Set up device
stty -F "$1" "$2" "$stopb" "$par" -icrnl

# Check if error ocurred
if [ "$?" -ne 0 ]; then
    printf "\n\nError ocurred, stty exited $?\n\n"
    exit 1;
fi

# Let cat read the device $1 in the background
cat -v "$1" &

# Capture PID of background process so it is possible to terminate it when done
bgPid="$!"

# Read commands from user, send them to device $1
while [ "$cmd" != "exit" ]
do
   read cmd
   echo -e "\x08$cmd\x0D" > "$1" #strip off the \n that read puts and adds \r for windows like LF

done

# Terminate background read process
kill "$bgPid"

PS: Sie müssen wissen, welche Art von Zeilenvorschub Ihr Empfängersystem verwendet, da dies bestimmt, wie Sie die Befehle in meinem Fall senden müssen. Ich benötigte ein Windows wie LF, dh, ich muss senden

command\r

ASCII-Werte für:

  • LF: 0Ah, Zeilenvorschub "\ n"
  • CR: 0Dh, Carrige Return "\ r"
  • BS: 08h, Leerzeichen "<-"
Rafael Karosuo
quelle
1
(1)  #!/bin/shwird ignoriert, wenn es nicht die erste Zeile der Datei ist. (2) Ernsthaft? Sie verwenden 1, um gerade Parität und ungerade2 anzugeben ? (3) Es ist üblich, eine "Verwendungs-" oder "Hilfemeldung" zu haben, die alle Parameter dokumentiert , nicht nur die obligatorischen. (4) Sie sollten immer Ihre Shell Variablenreferenzen zitieren (zB , , , , , , , und auch und ) es sei denn , Sie haben einen guten Grund nicht zu, und du bist sicher , dass Sie wissen , was Sie tun. "$1""$2""$3""$4""$stopb""$par""$bgPid""$?""$!"
Scott
1

Ich frage mich, warum niemand ser2net erwähnt hat .

Beispiel /etc/ser2net.conf:

3000:telnet:600:/dev/ttyUSB0:115200 8DATABITS NONE 1STOPBIT
3001:telnet:600:/dev/ttyUSB1:115200 8DATABITS NONE 1STOPBIT
3002:telnet:600:/dev/ttyUSB2:115200 8DATABITS NONE 1STOPBIT
3003:telnet:600:/dev/ttyUSB3:115200 8DATABITS NONE 1STOPBIT

Sie können eine Verbindung zum seriellen Port herstellen, wie folgt:

telnet localhost 3000

Oder aus der Ferne:

telnet <ip> 3000

Oder richten Sie die Portweiterleitung auf Ihrem Router ein und stellen Sie sie dem Internet zur Verfügung, damit Sie von überall aus eine Verbindung herstellen können (lassen Sie uns Sicherheitsprobleme überspringen, ich spreche von Flexibilität).

Andrejs Cainikovs
quelle
0

Eine andere einfache Möglichkeit ist, über ssh mit dem -XFlag auf die Maschine zuzugreifen und ein Programm wie putty oder gtkterm auszuführen.

Damit:

$ ssh -X <user>@<machine_address>

$ sudo apt-get install gtkterm (if not installed already)

$ gtkterm

Es sollte die grafische Oberfläche auf Ihrem Client-PC starten und von dort aus können Sie auf die serielle Schnittstelle zugreifen, als wären Sie auf dem Host.

Haftungsausschluss: Nur mit Ubuntu-Maschinen ausprobiert. Ich vermute, dass es mit Maschinen ohne grafische Oberflächen nicht funktioniert.

Aus dem SSH-Handbuch:

-X

Aktiviert die X11-Weiterleitung. Dies kann auch für jeden Host in einer Konfigurationsdatei angegeben werden. Die X11-Weiterleitung sollte mit Vorsicht aktiviert werden. Benutzer mit der Möglichkeit, Dateiberechtigungen auf dem Remote-Host (für die X-Berechtigungsdatenbank des Benutzers) zu umgehen, können über die weitergeleitete Verbindung auf die lokale X11-Anzeige zugreifen. Ein Angreifer kann dann möglicherweise Aktivitäten wie die Überwachung von Tastenanschlägen ausführen. Aus diesem Grund unterliegt die X11-Weiterleitung standardmäßig den Einschränkungen der X11 SECURITY-Erweiterung. Weitere Informationen finden Sie in der Option ssh -Y und der Anweisung ForwardX11Trusted in ssh_config (5).

-Y

Aktiviert die vertrauenswürdige X11-Weiterleitung. Vertrauenswürdige X11-Weiterleitungen unterliegen nicht den X11 SECURITY-Erweiterungssteuerelementen.

Verwenden Sie -Ydiese Option, wenn die Sicherheit ein Problem darstellt.

Grifo
quelle