web-dev-qa-db-fra.com

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

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 cat la sortie de /dev/ttyS0 mais une seule communication est possible de cette façon, du port à la console. Et echo vers le port est le même mais dans l'autre sens, vers le port.

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

95
ihatetoregister

Je trouve screen le programme le plus utile pour la communication série car je l'utilise quand même pour d'autres choses. C'est généralement juste screen /dev/ttyS0 <speed>, bien que les paramètres par défaut puissent être différents pour votre appareil. Il vous permet également de diriger n'importe quoi dans la session en entrant en mode commande et en faisant exec !! <run some program that generates output>.

76
Shawn J. Goff

Contexte

La principale raison pour laquelle vous avez besoin d'un programme any comme minicom pour communiquer sur un port série est que le port doit être configuré avant établir une connexion. S'il n'était pas configuré correctement, les commandes cat et echo ne feraient pas pour vous ce à quoi vous vous attendiez. Notez qu'une fois que vous exécutez un programme comme minicom, le port conserve les paramètres que minicom a utilisés. Vous pouvez interroger les paramètres de communication en utilisant le programme stty 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 comme minicom, les paramètres de communication seront à leurs paramètres par défaut. Ce sont probablement différents de ce dont vous aurez besoin pour établir votre connexion. Dans ce cas, l'envoi des commandes cat ou echo au port produira des ordures ou ne fonctionnera pas du tout.

Exécutez stty à nouveau après à l'aide de minicom, et vous remarquerez que les paramètres sont définis sur ce que le programme utilisait.

Communication série minimale

Fondamentalement, deux choses sont nécessaires pour avoir une communication bidirectionnelle via un port série: 1) configurer le port série et 2) ouvrir le pseudo-tty en lecture-écriture.

Le programme le plus basique que je connaisse qui fait cela est picocom. Vous pouvez également utiliser un outil comme setserial pour configurer le port, puis interagir avec lui directement à partir du shell.

50
rozcietrzewiacz

Si UUCP est installé sur le système, vous pouvez utiliser la commande c, par ex.

 $ cu -l /dev/ttyS0 -s 9600
26
ktf

J'ai trouvé un moyen d'utiliser un script Shell ici qui a mis cat comme processus d'arrière-plan et une boucle while qui lit l'entrée utilisateur et echo vers le port. Je l'ai modifié pour être plus général et il correspondait parfaitement à mon objectif.

#!/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
26
ihatetoregister

Essayez http://tio.github.io

"tio" est une application de terminal TTY simple qui présente une interface de ligne de commande simple pour se connecter facilement aux appareils TTY pour les entrées/sorties 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 une prise en charge complète de la complétion automatique Shell pour toutes les options.

15
Martin

Ce script est basé sur ne autre réponse , mais envoie tout sur le port série (sauf Ctrl+Q), pas seulement des commandes uniques suivies de Enter. Cela vous permet d'utiliser Ctrl+C ou Ctrl+Z sur l'hôte distant, et d'utiliser des programmes "GUI" interactifs comme aptitude ou alsamixer. Il peut être quitté 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"
14
Fritz

BTW, le package PuTTY (qui fonctionne sous Linux) inclut un support série.

7
mdpc

Un autre problème qui peut se produire est que votre compte d'utilisateur devra peut-être définir le groupe "dialout" pour accéder au port série.

Sudo usermod -a -G dialout $USER
5
dfowler7437

PuTTY fonctionne bien sous Linux et offre une certaine commodité, en particulier pour les communications série. Il 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 sur la surbrillance, un clic droit pour coller le comportement (et il existe d'excellents plugins pour les deux chrome et firefox pour activer le même comportement), mais sur Linux , pas de copie amour AFAIK.

Si le manque de copie est un problème (c'est pour moi), activez la connexion dans PuTTY et ouvrez une fenêtre de terminal standard et # tail -f PuTTY.log et du texte bidirectionnel est disponible pour une action copypasta standard.

3
gessel

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 terminaux" car elle ne permet plus l'injection de commandes Shell. Voir:

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

3
Nick Patavalis

Cela dépend de ce que vous voulez faire. Voulez-vous exécuter un shell ou une application de manière interactive à partir du 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 depuis un terminal sur un port série en configurant une session getty (1) sur le port série - getty est l'outil pour configurer un terminal et autoriser les connexions sur celui-ci . Placez une entrée dans votre fichier inittab (5) pour l'exécuter sur le port série approprié sur une base respawn.

Si vous souhaitez vous connecter à un appareil et lancer des conversations bidirectionnelles automatisées, vous pouvez voir si attendez vous obtiendrez ce que vous voulez. Utilisez stty (1) pour configurer le port à la bonne parité, à la vitesse de transmission 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 la seule norme prise 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 aboutissants des communications série et des E/S des terminaux sont assez complexes; vous pouvez en savoir plus sur ce sujet que vous ne l’avez jamais voulu dans le howto en série.

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 même configurer la redirection de port sur votre routeur et l'exposer à Internet, afin que vous puissiez vous y connecter de n'importe où (évitons les problèmes de sécurité, je parle de flexibilité).

2
Andrejs Cainikovs

Comme cela n'est pas déjà mentionné ici, je mentionnerais également socat - plus d'informations dans https://stackoverflow.com/questions/2899180/how-can-i-use-com-and -usb-ports-within-cygwin :

socat `tty`,raw,echo=0 /dev/ttyS15,raw,echo=0,setsid,sane

ou

socat - /dev/ttyS15,raw,echo=0,setsid,sane

(cependant, j'ai eu le problème de l'arrêter une fois qu'il a commencé à fonctionner, sous MSYS2 sous Windows)

2
sdbbs

Vous devez être sûr d'avoir les autorisations de lecture/écriture correctes sur l'appareil, vous pouvez le voir avec:

$ls -l /dev/[serial device]

Je me fie au 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 comme suit:

./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 comment vous devrez envoyer les commandes dans mon cas, j'avais besoin d'un Windows comme LF, cela signifie que j'ai besoin envoyer

command\r

Valeurs ASCII pour:

  • LF: 0Ah, saut de ligne "\ n"
  • CR: 0Dh, retour carrige "\ r"
  • BS: 08h, espace arrière "<-"
1
Rafael Karosuo

Vous voudrez peut-être jeter un œil à

http://serialconsole.sourceforge.net

Pro: n'a pas de problèmes de sécurité évidents comme minicom ou picocom (si vous n'avez pas de problème pour donner aux utilisateurs un accès Shell, pas de problème, mais vous en avez probablement en avoir un si vous souhaitez mettre en place un serveur de terminaux ...)

1
Peter

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

Donc:

$ 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 pouvez accéder au port série comme si vous étiez dans l'hôte.

Disclaimer: Seulement essayé avec les machines Ubuntu. Je suppose 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é 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 fichiers sur l'hôte distant (pour la base de données d'autorisation X de l'utilisateur) peuvent accéder à l'affichage 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. Pour cette raison, le transfert X11 est soumis par défaut aux restrictions d'extension X11 SECURITY. Veuillez vous référer à l'option ssh -Y et à la directive ForwardX11Trusted dans ssh_config (5) pour plus d'informations.

-Y

Active le transfert X11 de confiance. Les transferts X11 approuvés ne sont pas soumis aux contrôles d'extension X11 SECURITY.

Utilisez donc -Y si la sécurité est un problème.

0
Grifo