2009-06-02 23 views
22

Estoy depurando las comunicaciones con un dispositivo serie, y necesito ver todos los datos fluyendo en ambas direcciones.¿Cómo puedo controlar los datos en un puerto serie en Linux?

Parece que esto debería ser fácil en Linux, donde el puerto serie está representado por un archivo. ¿Hay alguna forma de que pueda hacer una especie de "tee bidireccional", donde le digo a mi programa que se conecte a un conducto que copie los datos en un archivo y también los mezcle en/desde el dispositivo de puerto en serie real?

Creo que podría incluso saber cómo escribir una bestia, pero parece que no es trivial, sobre todo para conseguir todas las ioctls pasado a través de la configuración de puertos, etc.

Alguien ha construido tal cosa ? Parece demasiado útil (para personas que depuran controladores de dispositivos en serie) no existir ya.

+6

Así que ... ¿cómo se termina haciendo esto, exactamente? – detly

+1

Sí, me interesaría saber también, ya que hasta ahora no pude entender cómo usar strace para esto. ¡Aclamaciones! – mac

+1

Esto podría ser de interés para aquellos que tuvieron problemas con la respuesta dada: http://unix.stackexchange.com/questions/12359/how-can-i-monitor-serial-port-traffic – geekboyUK

Respuesta

18

strace es muy útil para esto. Usted tiene una visualización de todas las llamadas ioctl, con la estructura correspondiente decodificada. Las siguientes opciones parece particularmente útil en su caso:

-e leer = establecen

Realice una hexadecimal y ASCII volcado completo de todos los datos leídos del descriptores de archivos que aparecen en el conjunto especificado. Por ejemplo, para ver toda la actividad de entrada en los descriptores de archivos 3 y 5 use -e read = 3,5. Tenga en cuenta que este es independiente del seguimiento normal de la llamada al sistema read (2) que es controlada por la opción -e trace = read.

escritura -e = SET

Realizar una completa hexadecimal y ASCII volcado de todos los datos grabados en el archivo descriptores que figuran en el conjunto especificado . Por ejemplo, para ver toda la actividad de salida en los descriptores de archivos 3 y 5 use -e write = 3,5. Tenga en cuenta que esto es independiente del rastreo normal de la llamada al sistema write (2) que es controlada por la opción -e trace = write.

+0

Perfecto, gracias! Sabía que tenía que haber una manera simple de hacer esto. Utilizo strace todo el tiempo, pero ni siquiera lo he considerado para esto. – divegeek

+4

Eso suena genial. Pero me pregunto: ¿cómo puedo averiguar cuál es el número de descriptor de archivo relevante? –

3

He encontrado que pyserial es bastante utilizable, así que si te gusta Python no debería ser demasiado difícil escribir una cosa así.

2

Un método simple sería escribir una aplicación que abrió el lado principal de una pty y el tty bajo prueba. A continuación, pasaría su aplicación tty al lado esclavo de la pty como el 'dispositivo tty'.

Usted tendría que supervisar los atributos de pty con tcgetattr() en el maestro pty y llame tcsetattr() en el TTY real, si los atributos cambiados.

El resto sería un simple select() en los datos de copia de fd bidireccionalmente y copiarlo en un registro.

+0

¿Cómo es posible controlar los eventos de un cambio realizado con 'tcsetattr()'? ¿Serían informados al escuchar con 'seleccionar'? – dolmen

+0

El controlador tty (y el sistema operativo) solo tienen un contrato en la respuesta de selección() con entrada y salida. Lo más fácil sería simplemente llamar a tcgetattr() después de una llamada de selección exitosa, antes de procesar cualquier entrada/salida. – codeDr

1

Miré una gran cantidad de rastreadores de serie. Todos ellos se basan en la idea de crear un puerto serie virtual y olfatear los datos de ese puerto. Sin embargo, cualquier cambio de baudios/paridad/flujo interrumpirá la conexión.

Entonces, escribí mi propio sniffer :). La mayoría de los puertos serie ahora son solo convertidores de USB a serie. Mi sniffer recolecta datos del USB a través de depuraciones, lo analiza y lo envía a la consola. Además, también se registran los cambios de velocidad de baudios, el control de flujo, los eventos de línea y los errores de serie. El proyecto se encuentra en la etapa inicial de desarrollo y, por ahora, solo es compatible con FTDI.

http://code.google.com/p/uscmon/

+0

Este aspecto interesante. ¿Sería genial si pudieras actualizar para usar cualquier vid/pid y dónde cambiarlo? – not2qubit

+0

sería bueno si tuviera un archivo MAKE – nhed

+0

Otra ubicación está aquí (https://github.com/after5cst/uscmon) y la discusión de problemas ayuda a compilarlo pero no parece realmente hacer el trabajo @MBR ¿tiene una versión actualizada? o documentación? – nhed

Cuestiones relacionadas