¿Cómo enviar datos a un puerto serie y ver alguna respuesta?

37

En Linux, quiero enviar una cadena de comando (es decir, algunos datos) a un puerto serie (que contiene caracteres de control) y escuchar la respuesta (que generalmente también puede contener caracteres de control).

¿Cómo puedo hacer esto lo más simple posible en Linux? Un ejemplo es apreciado!

Alex
fuente
deberías mirar este unix.stackexchange.com/a/116705/53092
Kiwy
No tengo instalada la intercepción.
Alex
1
nominando para reabrir - no es un duplicado como se sugiere.
peterph 01 de
Algunas personas son demasiado estúpidas, simplemente sugieren preguntas como dudosas. Primero moleste en leer las preguntas y respuestas.
Denis

Respuestas:

54

Todos los dispositivos en Unix se asignan a un archivo de dispositivo, los puertos seriales serían /dev/ttyS0 /dev/ttyS1....

Primero eche un vistazo a los permisos en ese archivo, supongamos que está utilizando /dev/ttyS1.

ls -l /dev/ttyS1

Querrá acceso read.write, si este es un sistema compartido, entonces debe considerar las consecuencias de seguridad de abrirlo para todos.

chmod o+rw /dev/ttyS1

Un método crudo muy simple para escribir en el archivo, usaría el echocomando simple .

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

y leer

cat -v < /dev/ttyS1

Puede tener un gato corriendo en una terminal y hacer eco en una segunda.

Si todo es galimatías, entonces la velocidad en baudios, la configuración de bits puede necesitar configuración antes de comenzar a enviar. sttylo haré. !! NOTA stty usará stdin como descriptor de archivo predeterminado para afectar.

Comandos equivalentes.

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

¿Esto podría ser suficiente para que escribas algo y te registres? No estoy seguro de lo que estás tratando de lograr.

Para un modo más interactivo, recuerda que tu enfoque de configuración predeterminada sería usarlo minicom, es solo un programa que hace todo lo que he mencionado hasta ahora. (similar a hyperterminal en Windows, puede ser familiar).

Una solución intermedia utilizaría un programa de terminal como el screenque funcionará en un dispositivo en serie.

screen /dev/ttyS1

man screen man minicom man stty para más información

X Tian
fuente
No estoy obteniendo ningún resultado en absoluto. ¿Tienes alguna idea?
Goldname
Posiblemente el control de flujo de hardware, apague con el comando atty o amarre alto en el cable serie, busque un cable de módem nulo.
X Tian
1
# stty -speed 38400 -f /dev/ttyUSB1vuelvestty: invalid argument '-speed'
Pro Backup
1
en stty es -F (F mayúscula) para configurar el dispositivo. También su parámetro de velocidad es incorrecto. Puede usar la velocidad para obtener la velocidad en baudios del puerto, o la velocidad o la velocidad (sin el signo menos) para establecer las velocidades de entrada y salida, o simplemente un número para establecer las velocidades de entrada y salida, de la siguiente manera: stty 19200 -F / dev / ttyS ....
Paulus
Es sorprendente que nadie haya notado eso antes, gracias @Pro Backup He corregido el ejemplo.
X Tian
11

Todo lo que tienes que hacer es abrir dos terminales. En la primera terminal, cattodo desde el dispositivo, p. Ej.

cat /dev/ttyS0

en el otro terminal, puede enviar caracteres hexadecimales arbitrarios y texto al terminal, por ejemplo, de la siguiente manera:

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

El echo -ecomando permite la interpretación de escapes de barra invertida.

Por supuesto, es necesario asegurarse de que (i) la configuración en serie (velocidad, longitud de palabra, control de flujo, etc.) sea correcta y (ii) el dispositivo en serie (en el otro extremo) no esté bloqueado.

Alex
fuente
¡Has respondido esto 10 minutos después de que escribí mi respuesta arriba y no has agregado más información!
X Tian
Oh, lo siento, no leí tu respuesta por completo. Vi que mi respuesta está incluida en la suya, por lo que aceptaré su respuesta como la correcta, como usted describió exactamente lo que he descrito.
Alex
No sé mucho sobre puertos COM. ¿Podría explicar qué significa "el dispositivo serie (en el otro extremo) no está bloqueando"? ¿Algún problema con el firewall?
Sopalajo de Arrierez
9

Programas que hablan con dispositivos seriales:

picocom
minicom
socat

o desde shell puedes hacer:

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
fuente
la suya es una respuesta increíble que me enseñó sobre descriptores de archivo bidireccionales. Sin embargo, ¿está seguro de que la sintaxis de la última línea para cerrar el descriptor es correcta? Me sale un error de sintaxis. Creo que exec 99<&-o exec 99>&-debería usarse. ¿O posiblemente ambos?
Yankee
1
error tipográfico ... tienes razón
Zibri
7

Este podría ser un mejor enfoque:

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
fuente
¡Esto es muy bueno porque automatiza el proceso! El único cambio que haría, que es totalmente opcional, es confirmar que el contenido recibido es el mismo que el enviado, podría ser solo un recuento o completo en diff.
HiDefLoLife
4

Puede leer y escribir en un dispositivo de forma simultánea de la siguiente manera:

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

Su mensaje se envía al segundo catdesde stdin, y el primero cattransmite la respuesta stdout, convirtiendo su terminal en una sala de chat.

Para finalizar, ctrl-cy luego ejecutar fga continuación, ctrl-cde nuevo.

diadeélico
fuente