Comment se connecter à un port série aussi simple que d'utiliser SSH?

86

Existe-t-il un moyen de se connecter à un terminal série comme vous le feriez avec SSH? Il doit y avoir un moyen plus simple que des outils tels que Minicom, comme celui-ci

$ serial /dev/ttyS0 

Je sais que je peux obtenir catla sortie, /dev/ttyS0mais une communication à sens unique est ainsi possible, du port à la console. Et echoau port, c'est pareil, mais dans le sens inverse, au port.

Comment réaliser une communication bidirectionnelle avec un port série de la manière la plus simple possible sous Unix / Linux?

ihatetorgister
la source
2
Excellentes réponses aux gens! Malheureusement, personne ne semble parfaitement répondre à mes besoins lorsque vous travaillez avec des systèmes embarqués avec un ensemble de commandes limité. J'ai cependant trouvé une autre solution en utilisant un script shell que j'ajoute comme l'une des réponses à ma question.
ihatetoregister

Réponses:

69

Je trouve screenle programme le plus utile pour la communication série puisque je l’utilise de toute façon pour d’autres tâches. C'est généralement juste screen /dev/ttyS0 <speed>, même si les paramètres par défaut peuvent être différents pour votre appareil. Il vous permet également de canaliser n'importe quoi dans la session en entrant en mode commande et en faisant exec !! <run some program that generates output>.

Shawn J. Goff
la source
3
+1 pour l'écran! Voir aussi: serverfault.com/q/81544/11086
Josh
1
Voir aussi noah.org/wiki/Screen_notes#using_screen_as_a_serial_terminal et la page de manuel stty (1), j'ai dû ajouter des options supplémentaires (par exemple, la parité) pour que cela fonctionne.
Lekensteyn
3
a honte d' avoir mal connecté le TX / RX: o
Lekensteyn
screenest génial, mais je ne pense pas plus simple que minicom:-)
Ciro Santilli新疆改造中心法轮功六四事件
1
@CiroSantilli Screen 死 六四 - Screen n'est peut-être pas plus simple que Minicom mais, étant donné que j'utilise déjà Screen, il est pour moi moins complexe de faire mon travail en série avec Screen, ce qui élimine totalement le besoin de Minicom.
yeti
48

Contexte

La principale raison pour laquelle tout programme souhaitant minicomcommuniquer via un port série est nécessaire, c’est que le port doit être configuré avant d’établir une connexion. S'il n'était pas configuré correctement, les commandes catet echone feraient pas pour vous ce à quoi vous vous attendiez. Notez qu’une fois que vous exécutez un programme minicom, le port reste avec les paramètres minicomutilisés. Vous pouvez interroger les paramètres de communication en utilisant le sttyprogramme comme ceci:

stty < /dev/ttyS0

Si vous l'avez bien fait; après le démarrage de l'ordinateur et avant d'exécuter tout autre programme tel que minicom,les paramètres de communication seront leurs paramètres par défaut. Celles-ci sont probablement différentes de celles dont vous aurez besoin pour établir votre connexion. Dans cette situation, l'envoi des commandes catou echoau port produira des déchets ou ne fonctionnera pas du tout.

Exécuter à sttynouveau après l' utilisation minicom, et vous remarquerez les paramètres sont définis à ce que le programme utilisait.

Communication série minimale

Une communication bidirectionnelle à travers un port série nécessite essentiellement deux choses: 1) configurer le port série et 2) ouvrir le pseudo-tty en lecture-écriture.

Le programme le plus fondamental que je connaisse est le suivant picocom. Vous pouvez également utiliser un outil comme setserialconfigurer le port, puis interagir directement avec celui-ci à partir du shell.

rozcietrzewiacz
la source
5
picocomvous permettra également de vous connecter à un port série sans le reconfigurer ( --noinit) et vous permettra de quitter sans restaurer la configuration du port série ( --noresetou d'utiliser Ctrl-A/ Ctrl-Qpour quitter picocom). J'ai trouvé picocomêtre beaucoup plus facile à utiliser que minicom. Pour des raisons que je n'ai pas comprises, minicom n'enverra parfois ni n'enverra de données sur un port qui a déjà fonctionné quelques instants auparavant ou pour lequel picocom n'a aucun problème. C'est probablement une option de configuration mystérieuse, mais peu importe ce que je ne peux pas comprendre (et ce problème est survenu sur plus d'une machine).
Michael Burr
+1 pour picocom! J'ai constaté que je ne pouvais pas écrire de commandes sur le périphérique série sans les fins de ligne correctes: je devais utiliser des --omap crcrlf --echooptions
utilisateur2561747
24

Si UUCP est installé sur le système, vous pouvez utiliser la commande cu , par exemple

 $ cu -l /dev/ttyS0 -s 9600
ktf
la source
Utilisez ~^Dou ~.pour sortir.
iman
24

J'ai trouvé un moyen utilisant un script shell ici qui a mis catcomme un processus d'arrière - plan et une boucle while qui a lu l'entrée d'utilisateur et echohors du port. Je l'ai modifié pour qu'il soit plus général et qu'il répondait parfaitement à mes besoins.

#!/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
ihatetorgister
la source
1
En outre, j'ai créé une version légèrement modifiée ci-dessous qui peut également envoyer Ctrl + C et Ctrl + Z.
Fritz
@Fritz Belle trouvaille! Donc, si je comprends bien, le processus d'arrière-plan ne sera jamais tué parce que $? ne semble pas s'étendre à quelque chose non?
ihatetoregister
1
@ ihatetoregister: Pas tout à fait correct. Le processus d'arrière-plan est éliminé, mais pas pour les raisons auxquelles on pourrait s'attendre. $?se développe en code de sortie de la dernière commande autre que d'arrière-plan (dans ce cas stty -F $1 $2), ainsi il se développe à 0 lorsqu'il n'y a pas d'erreur. Ainsi, la dernière ligne devient kill 0ce qui semble à son tour tuer le shell actuel et tous ses enfants (il se comporte différemment dans les shells interactifs, je crois). Pour tous les détails, voir l'explication suivante: unix.stackexchange.com/questions/67532/…
Fritz
1
Howerver, le vrai Gotcha dans votre script est que le processus d'arrière - plan ne tue si vous appuyez sur Ctrl + D pour mettre fin à votre script, parce que les extrémités de la whileboucle proprement. Si vous le tuez avec Ctrl + C ou avec la killcommande, le catprocessus reste actif. Pour résoudre ce problème, vous devez utiliser la trapcommande à exécuter kill $bgPidlorsque le shell se ferme, comme le fait mon script ci-dessous . Honnêtement, cela ne me dérangerait même pas que vous ajoutiez mon script entier à votre message. J'ai essayé de le faire, mais le montage a été rejeté.
Fritz
Pourriez-vous s'il vous plaît préciser où la connexion entre, comme cela est commenté dans votre réponse
Chris Halcrow
14

Essayez http://tio.github.io

"tio" est une simple application de terminal TTY dotée d'une interface de ligne de commande simple permettant de se connecter facilement à des périphériques TTY pour une entrée / sortie de base.

L'utilisation typique est sans options. Par exemple:

tio /dev/ttyS0

Ce qui correspond aux options couramment utilisées:

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

Il est livré avec un support complet d'auto-complétion du shell pour toutes les options.

Martin
la source
3
J'utilise msys2sous Windows et vous pouvez l' installer tioavec , pacman -S tiocar il est parmi les paquets disponibles par défaut. screen, picocometc. ne sont pas. Merci!
Kohányi Róbert
12

Ce script est basé sur une autre réponse , mais envoie tout via le port série (sauf Ctrl + Q), pas seulement les commandes simples suivies de Enter. Cela vous permet d'utiliser Ctrl + C ou Ctrl + Z sur l'hôte distant et d'utiliser des programmes interactifs "GUI" comme aptitude ou alsamixer. Vous pouvez le quitter en appuyant sur Ctrl + Q.

#!/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
la source
7

BTW, le paquet putty (qui tourne sous Linux) inclut le support série.

mdpc
la source
4

Un autre problème pouvant survenir est que votre compte d'utilisateur peut avoir besoin de définir le groupe "dialout" pour accéder au port série.

sudo usermod -a -G dialout $USER
dfowler7437
la source
3

Putty fonctionne bien sous Linux et offre une certaine commodité, en particulier pour les communications série. Cela a un inconvénient que je n'ai pas pu résoudre directement: pas de copier-coller à partir de la fenêtre Putty elle-même. La version Windows a une belle copie automatique dans le presse-papiers en surbrillance, un clic droit pour coller (et il existe d'excellents plugins pour chrome et firefox permettant le même comportement), mais sous Linux, aucune copie ne ressemble à AFAIK.

Si le manque de copie est un problème (c'est pour moi), activez la connexion au mastic, ouvrez une fenêtre de terminal standard # tail -f putty.loget un texte bidirectionnel est disponible pour l'action Copypasta standard.

gessel
la source
1
Je trouve que Putty sous Linux ne colle pas "le presse-papier" (ce que vous copiez avec control-C), mais il insérera "la sélection primaire" (ce que vous avez actuellement sélectionné dans un programme) avec la souris intermédiaire. De même, vous pouvez sélectionner des caractères dans l'écran de Putty pour définir la sélection principale. Mais si je veux que le texte d'un écran Putty soit transféré sur une machine virtuelle, j'ai besoin que ce soit le presse-papier. Je dois donc utiliser un programme intermédiaire pour recevoir le texte de la sélection principale, puis le copier dans le presse-papier.
homme de l'espace cardiff
3

Comme mentionné précédemment, vous pouvez essayer picocom. La dernière version (2.0) peut également être utilisée (en toute sécurité) pour configurer un "serveur de terminal" car elle ne permet plus l'injection de commandes shell. Voir:

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

Nick Patavalis
la source
2

Cela dépend de ce que vous voulez faire. Voulez-vous exécuter un shell ou une application de manière interactive depuis le terminal, vous connecter à un autre ordinateur via la ligne série, automatiser la communication avec un périphérique via un port série?

Si vous voulez une communication bidirectionnelle, je suppose que vous voulez quelque chose d’interactif avec un humain sur le terminal. Vous pouvez configurer le système pour autoriser les connexions d'un terminal sur un port série en configurant une session getty (1) sur le port série. Getty est l'outil permettant de configurer un terminal et de lui permettre de se connecter. Mettez une entrée dans votre fichier inittab (5) pour l’exécuter sur le port série approprié sur une respawnbase.

Si vous souhaitez vous connecter à un appareil et initier des conversations automatisées à double sens, vous pouvez voir si attendez -vous à obtenir ce que vous voulez. Utilisez stty (1) pour configurer le port sur la bonne parité, le débit en bauds et d’autres paramètres pertinents.

Si vous souhaitez communiquer de manière interactive avec un autre ordinateur via le port série, vous aurez besoin d'un logiciel d'émulation de terminal. Cela fait beaucoup - il configure le port, interprète ANSI ou d’autres séquences de commandes de terminal (ANSI était loin d’être le seul standard pris en charge par les terminaux série). De nombreux émulateurs de terminaux prennent également en charge les protocoles de transfert de fichiers tels que kermit ou zmodem.

Les tenants et les aboutissants des communications série et des E / S de terminal sont assez complexes. vous pouvez lire plus que vous n’auriez jamais voulu savoir sur le sujet dans cet ouvrage en série.

Préoccupé parTonbridgeWells
la source
1

Vous voudrez peut-être jeter un oeil à

http://serialconsole.sourceforge.net

Pro: ne pas avoir des problèmes de sécurité évidents comme Minicom ou picocom (si vous ne disposez pas d' un problème donnant aux utilisateurs un accès shell, pas de problème, mais vous avez très probablement faire avoir un si vous voulez configurer un serveur de terminal ... )

Peter
la source
1

Vous devez vous assurer d’avoir les autorisations de lecture / écriture correctes sur le périphérique, vous pouvez le voir avec:

$ls -l /dev/[serial device]

Je m'appuie sur le script que vous avez trouvé et apporté quelques modifications.

Pour les systèmes de développement que j'ai utilisés jusqu'à présent, ils avaient besoin de:

  • Aucune parité et
  • Un bit d'arrêt

Ces valeurs sont celles par défaut dans le script.

Donc, pour vous connecter, vous pouvez l'utiliser aussi simplement que:

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

Exemple:

$./connect.sh /dev/ttyUSB0 19200

Scénario:

#!/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: Vous devez savoir quel type de saut de ligne utilise votre système récepteur, car cela déterminera la manière dont vous devrez envoyer les commandes. Dans mon cas, j'avais besoin d'un Windows comme LF. Cela signifie que je dois envoyer

command\r

Valeurs ASCII pour:

  • LF: 0Ah, saut de ligne "\ n"
  • CR: 0Dh, retour carrige "\ r"
  • BS: 08h, espace arrière "<-"
Rafael Karosuo
la source
1
(1)  #!/bin/shest ignoré s'il ne s'agit pas de la première ligne du fichier. (2) sérieusement? Vous utilisez 1pour spécifier une parité paire et 2pour spécifier un impair ? (3) Il est classique d’avoir un message «d’utilisation» ou «d’aide» qui documente tous les paramètres, pas seulement ceux qui sont obligatoires. (4) Vous devez toujours citer vos références shell variables (par exemple, "$1", "$2", "$3", "$4", "$stopb", "$par", "$bgPid", et même "$?"et "$!") à moins que vous avez une bonne raison de ne pas, et vous êtes sûr que vous savez ce que vous faites.
Scott
1

Je me demande pourquoi personne n'a mentionné ser2net .

Exemple /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

Vous pouvez vous connecter au port série aussi facilement que:

telnet localhost 3000

Ou à distance:

telnet <ip> 3000

Ou encore, configurez la redirection de port sur votre routeur et exposez-la à Internet, de sorte que vous puissiez vous y connecter depuis n'importe où (ignorons les problèmes de sécurité, je parle de flexibilité).

Andrejs Cainikovs
la source
0

Une autre option simple consiste à accéder à la machine via ssh avec le -Xdrapeau et à exécuter un programme tel que putty ou gtkterm.

Alors:

$ ssh -X <user>@<machine_address>

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

$ gtkterm

Il devrait lancer l'interface graphique sur votre PC client et à partir de là, vous pourrez accéder au port série comme si vous étiez dans l'hôte.

Déni de responsabilité: seulement essayé avec les machines Ubuntu. J'imagine que cela ne fonctionnera pas avec des machines sans interfaces graphiques.

Du manuel ssh:

-X

Active le transfert X11. Cela peut également être spécifié hôte par hôte dans un fichier de configuration. Le transfert X11 doit être activé avec prudence. Les utilisateurs ayant la possibilité de contourner les autorisations de fichier sur l'hôte distant (pour la base de données d'autorisation X de l'utilisateur) peuvent accéder à l'écran X11 local via la connexion transférée. Un attaquant peut alors être en mesure d’effectuer des activités telles que la surveillance des frappes au clavier. Pour cette raison, le transfert X11 est soumis par défaut aux restrictions d’extension X11 SECURITY. Veuillez vous reporter à l’option ssh -Y et à la directive ForwardX11Trusted de ssh_config (5) pour plus d’informations.

-Y

Active le transfert X11 de confiance. Les redirections X11 de confiance ne sont pas soumises aux contrôles d'extension X11 SECURITY.

Alors utilisez -Ysi la sécurité est un problème.

Grifo
la source