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é!
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 screen
man minicom
man stty
pour plus d'informations
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.
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>&-
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
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.