web-dev-qa-db-fra.com

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

Sous Linux, je veux envoyer une chaîne de commande (c'est-à-dire certaines données) à un port série (contenant des caractères de contrôle) et écouter la réponse (qui peut également contenir généralement des caractères de contrôle).

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

45
Alex

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 ....

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

ls -l /dev/ttyS1

Vous voudrez un accès read.write, s'il s'agit d'un système partagé, vous devriez considérer les conséquences de sécurité de son ouverture pour tout le monde.

chmod o+rw /dev/ttyS1

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

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

et lire

cat -v < /dev/ttyS1

Vous pouvez avoir un chat en cours d'exécution dans un terminal et un écho dans un deuxième.

Si tout est du charabia, alors le débit en bauds, les paramètres de bits peuvent avoir besoin d'être définis avant de commencer l'envoi. stty fera cela. !! REMARQUE stty utilisera stdin comme descripteur de fichier par défaut pour l'affecter.

Commandes équivalentes.

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

Cela pourrait vous suffire pour créer un script et vous connecter? Je ne sais pas ce que vous essayez de réaliser.

Pour une approche plus interactive, se souvient que votre approche des paramètres par défaut serait d'utiliser minicom c'est juste un programme qui fait tout ce que j'ai mentionné jusqu'à présent. (similaire à l'hyperterminal dans Windows, vous pourriez être familier).

Une solution intermédiaire, utiliserait un programme de terminal comme screen qui fonctionnera sur un périphérique série.

screen /dev/ttyS1

man screenman minicomman stty pour plus d'informations

60
X Tian

Il vous suffit d'ouvrir deux terminaux. Dans le premier terminal, vous cat tout de l'appareil, par ex.

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 commande echo -e Permet d'interpréter les échappements antislash.

Il faut bien sûr s'assurer que (i) les paramètres série (vitesse, longueur des mots, débit ctrl, etc.) sont corrects et (ii) le périphérique série (à l'autre extrémité) ne bloque pas.

14
Alex

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

picocom
minicom
socat

ou depuis 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>&-
12
Zibri

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
8
Leonardo Mendoza

Vous pouvez lire et écrire sur un appareil simultanément comme ceci:

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

Votre message est envoyé au deuxième cat de stdin et le premier cat relaie la réponse à stdout, transformant votre terminal en salon de discussion.

Pour finir, ctrl-c, puis exécutez fg puis ctrl-c encore.

4
diachedelic