Comment envoyer des données à un port série et voir une réponse?

37

Sous Linux, je souhaite envoyer une chaîne de commande (des données, par exemple) vers un port série (contenant des caractères de contrôle) et écouter la réponse (qui peut également contenir des caractères de contrôle).

Comment puis-je le faire le plus simplement possible sur Linux? Un exemple est apprécié!

Alex
la source
vous devriez regarder ce unix.stackexchange.com/a/116705/53092
Kiwy
Je n'ai pas d'interceptty installé.
Alex
1
nomination pour la réouverture - ce n'est pas un duplicata comme suggéré.
Peter
certaines personnes sont trop stupides, elles suggèrent simplement des questions comme doublons. Commencez par lire les questions et répondez.
Denis

Réponses:

54

Tous les périphériques sous Unix sont mappés sur un fichier de périphérique, les ports série seraient /dev/ttyS0 /dev/ttyS1....

D'abord, jetez un coup d'œil aux autorisations sur ce fichier, supposons que vous utilisez /dev/ttyS1.

ls -l /dev/ttyS1

Vous voudrez avoir un accès en lecture / écriture. S'il s'agit d'un système partagé, vous devez tenir compte des conséquences de son ouverture pour tout le monde en termes de sécurité.

chmod o+rw /dev/ttyS1

Une méthode brute très simple pour écrire dans le fichier utiliserait la echocommande simple .

echo -ne '\033[2J' > /dev/ttyS1

et lire

cat -v < /dev/ttyS1

Vous pouvez avoir un chat qui court dans un terminal et un deuxième.

Si tout est du charabia, le débit en bauds peut être nécessaire avant de commencer l’envoi. sttyFera cela. !! REMARQUE: stty utilisera stdin comme descripteur de fichier par défaut à affecter.

Commandes équivalentes.

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

Cela pourrait vous suffire pour écrire un script et vous connecter? Pas sûr de ce que vous essayez d'atteindre.

Pour une approche plus interactive, souvenez-vous que votre approche des paramètres par défaut serait de l’utiliser, minicomc’est juste un programme qui fait tout ce que j’ai déjà mentionné. (semblable à hyperterminal dans Windows, vous pourriez être familier).

Une solution intermédiaire utiliserait un programme de terminal comme celui screenqui fonctionnera sur un périphérique série.

screen /dev/ttyS1

man screen man minicom man stty pour plus d'informations

X Tian
la source
Je ne reçois aucune sortie du tout. Avez-vous des idées?
Goldname
Le cas échéant, contrôle du flux de matériel, désactivez-le avec la commande atty ou attachez-le avec un câble série, recherchez le câble null modem.
X Tian
1
# stty -speed 38400 -f /dev/ttyUSB1renvoiestty: invalid argument '-speed'
Pro Backup
1
sur stty, c’est -F (F majuscule) pour configurer l’appareil. De plus, votre paramètre de vitesse est incorrect. Vous pouvez utiliser speed pour obtenir le débit en bauds du port, ou ispeed ou ospeed (sans le signe moins) pour définir les vitesses d'entrée et de sortie, ou simplement un nombre pour définir les vitesses d'entrée et de sortie, comme suit: stty 19200 -F / dev / ttyS ....
Paulus
Incroyable que personne ne l’ait remarqué auparavant, merci @Pro Backup, j’ai corrigé l’exemple.
X Tian
11

Tout ce que vous avez à faire est d'ouvrir deux terminaux. Dans le premier terminal, cattout ce qui est à partir de l'appareil, par exemple

cat /dev/ttyS0

dans l'autre terminal, vous pouvez envoyer des caractères hexadécimaux arbitraires et du texte au terminal, par exemple comme suit:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

La echo -ecommande permet l'interprétation des échappements de barre oblique inverse.

Il faut bien sûr s’assurer que (i) les paramètres série (vitesse, longueur du mot, contrôle du flux, etc.) sont corrects et (ii) que le périphérique série (à l’autre extrémité) ne bloque pas.

Alex
la source
Vous avez répondu à cette question 10 minutes après avoir écrit ma réponse ci-dessus et vous n'avez ajouté aucune information supplémentaire!
X Tian
Oh désolé, je n'ai pas lu votre réponse complètement. J'ai vu que ma réponse est incluse dans la vôtre. J'accepterai donc votre réponse comme étant correcte, car vous avez décrit exactement ce que j'ai décrit.
Alex
Je ne sais pas beaucoup sur les ports COM. Pourriez-vous s'il vous plaît expliquer ce que signifie "le périphérique série (à l'autre extrémité) ne bloque pas"? Un problème avec le pare-feu?
Sopalajo de Arrierez le
9

Programmes qui parlent aux périphériques série:

picocom
minicom
socat

ou de shell vous pouvez faire:

stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99  # this reads just a CR
read answer <&99  # this reads the answer OK
exec 99>&-
Zibri
la source
yours est une réponse géniale qui m’a appris à propos des descripteurs de fichiers bidirectionnels. Cependant, êtes-vous sûr que la syntaxe de la dernière ligne permettant de fermer le descripteur est correcte? Je reçois une erreur de syntaxe. Je pense que exec 99<&-ou exec 99>&-devrait être utilisé. Ou peut-être les deux?
Yankee
1
erreur de frappe .. vous avez raison
Zibri le
7

Cela pourrait être une meilleure approche:

stty -F /dev/ttyUSB0 115200 raw -echo   #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0                     #REDIRECT SERIAL OUTPUT TO FD 3
  cat <&3 > /tmp/ttyDump.dat &          #REDIRECT SERIAL OUTPUT TO FILE
  PID=$!                                #SAVE PID TO KILL CAT
    echo "R" > /dev/ttyUSB0             #SEND COMMAND STRING TO SERIAL PORT
    sleep 0.2s                          #WAIT FOR RESPONSE
  kill $PID                             #KILL CAT PROCESS
  wait $PID 2>/dev/null                 #SUPRESS "Terminated" output

exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA
Leonardo Mendoza
la source
C'est très bien car cela automatise le processus! Le seul changement que je ferais, qui est totalement facultatif, consiste à confirmer que le contenu reçu est identique à celui envoyé - il pourrait ne s'agir que d'un décompte ou d'une résolution complète.
HiDefLoLife
4

Vous pouvez lire et écrire simultanément sur un périphérique de la manière suivante:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

Votre message est envoyé à la seconde personne catde stdin, et la première catrelaie la réponse stdout, transformant votre terminal en salle de discussion.

Pour finir, ctrl-c, puis exécutez fgensuite à ctrl-cnouveau.

diachedelic
la source