serie serial puerto probar linux serial-port virtual-serial-port

serial - Puerto serie virtual para Linux



puerto serie terminal linux (8)

Necesito probar una aplicación de puerto serie en Linux, sin embargo, mi máquina de prueba solo tiene un puerto serie.

¿Hay alguna manera de agregar un puerto serial virtual a Linux y probar mi aplicación emulando un dispositivo a través de un shell o script?

Nota: No puedo reasignar el puerto, está codificado en ttys2 y necesito probar la aplicación tal como está escrita.


¿Sería capaz de usar un adaptador USB-> RS232? Tengo algunos y solo usan el controlador FTDI. Entonces, debería poder renombrar / dev / ttyUSB0 (o ​​lo que sea que se cree) como / dev / ttyS2.


Complementando la respuesta de @ slonik.

Puede probar socat para crear Virtual Serial Port realizando el siguiente procedimiento (probado en Ubuntu 12.04):

Abra una terminal (llamémosla Terminal 0) y ejecútela:

socat -d -d pty,raw,echo=0 pty,raw,echo=0

El código de arriba regresa:

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2 2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3 2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]

Abra otra terminal y escriba (Terminal 1):

cat < /dev/pts/2

el nombre del puerto de este comando se puede cambiar de acuerdo con la pc. depende de la salida anterior.

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2** 2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3** 2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs

debe usar el número disponible en el área resaltada.

Abra otra terminal y escriba (Terminal 2):

echo "Test" > /dev/pts/3

Ahora regrese a la Terminal 1 y verá la cadena "Test".


Es posible que desee ver Tibbo VSPDL para crear un puerto serie virtual de Linux con un controlador Kernel: parece bastante nuevo y está disponible para su descarga en este momento (versión beta). No estoy seguro acerca de la licencia en este momento, o si quieren que esté disponible comercialmente solo en el futuro.

Hay otras alternativas comerciales, como http://www.ttyredirector.com/ .

En Código Abierto, Remserial (GPL) también puede hacer lo que quiera, utilizando Unix PTY. Transmite los datos en serie en "forma cruda" a un socket de red; La configuración de parámetros de terminal al estilo de STTY debe hacerse al crear el puerto, no parece que sea posible cambiarlos más tarde como se describe en RFC 2217. Debería poder ejecutar dos instancias de remserial para crear un nullmodem virtual como com0com, excepto que necesitará configurar la velocidad del puerto, etc. de antemano.

Socat (también GPL) es como una variante extendida de Remserial con muchas más opciones, incluido un método "PTY" para redirigir el PTY a otra cosa, que puede ser otra instancia de Socat. Para las unidades de la unidad, es probable que socat sea mejor que remserial porque puede enviar directamente los archivos al PTY. Vea el ejemplo de PTY en la página de manual. Existe un parche bajo "contrib" para proporcionar soporte RFC2217 para negociar configuraciones de línea serie.


Puedo pensar en tres opciones:

Implementar RFC 2217

RFC 2217 cubre un puerto COM a TCP / IP estándar que permite a un cliente en un sistema emular un puerto serie a los programas locales, mientras envía y recibe datos y señales de control transparentes a un servidor en otro sistema que realmente tiene el puerto serie. Aquí hay una descripción general de alto nivel .

Lo que haría sería encontrar o implementar un controlador de puerto de cliente del cliente que implementaría el lado del cliente del sistema en su PC, aparentando ser un verdadero puerto serie pero en realidad transportándolo todo a un servidor. Es posible que pueda obtener este controlador gratis de Digi, Lantronix, etc. en apoyo de sus verdaderos servidores de puerto serie independientes.

A continuación, implementaría el lado del servidor de la conexión localmente en otro programa, lo que permitiría al cliente conectarse y emitir los datos y controlar los comandos según sea necesario.

Probablemente no sea trivial, pero el RFC está ahí fuera, y es posible que pueda encontrar un proyecto de código abierto que implemente uno o ambos lados de la conexión.

Modificar el controlador del puerto serie de Linux

Alternativamente, el origen del controlador del puerto serie para Linux está disponible. Tome eso, guíe las piezas de control de hardware, y haga que ese controlador ejecute dos puertos / dev / ttySx, como un bucle de retorno simple. Luego, conecte su programa real al ttyS2 y su simulador al otro ttySx.

Utilice dos cables serie USB <-> en un bucle invertido

Pero lo más fácil de hacer en este momento? Gaste $ 40 en dos dispositivos USB de puerto serie, conéctelos (módem nulo) y tenga dos puertos seriales reales, uno para el programa que está probando, uno para su simulador.

-Adán


También hay tty0tty http://sourceforge.net/projects/tty0tty/ que es un verdadero emulador de módem nulo para Linux.

Es un módulo kernel simple: un pequeño archivo fuente. No sé por qué solo obtuvo aprobación en sourceforge, pero funciona bien para mí. Lo mejor de todo es que también emula los pines de hardware (RTC / CTS DSR / DTR). ¡Incluso implementa comandos TIOCMGET / TIOCMSET y TIOCMIWAIT iotcl!

En un kernel reciente puede tener errores de compilación. Esto es fácil de arreglar. Solo inserte unas líneas en la parte superior del módulo / tty0tty.c fuente (después de las incluidas):

#ifndef init_MUTEX #define init_MUTEX(x) sema_init((x),1) #endif

Cuando el módulo está cargado, crea 4 pares de puertos serie. Los dispositivos son / dev / tnt0 a / dev / tnt7, donde tnt0 está conectado a tnt1, tnt2 está conectado a tnt3, etc. Es posible que necesite corregir los permisos del archivo para poder usar los dispositivos.

editar:

Creo que fui un poco rápido con mi entusiasmo. Si bien el conductor parece prometedor, parece inestable. No estoy seguro, pero creo que se estrelló una máquina en la oficina en la que estaba trabajando desde casa. No puedo verificar hasta que regrese a la oficina el lunes.

Lo segundo es que TIOCMIWAIT no funciona. El código parece estar copiado de algún código de ejemplo "tiny tty". El manejo de TIOCMIWAIT parece estar en su lugar, pero nunca se despierta porque falta la llamada correspondiente a wake_up_interruptible ().

editar:

El accidente en la oficina realmente fue culpa del conductor. Faltaba una inicialización, y el código TIOCMIWAIT completamente no probado causaba un bloqueo de la máquina.

Pasé ayer y hoy reescribiendo el controlador. Hubo muchos problemas, pero ahora funciona bien para mí. Todavía falta el código para el control de flujo de hardware gestionado por el controlador, pero no lo necesito porque administraré los pines utilizando TIOCMGET / TIOCMSET / TIOCMIWAIT desde el código de modo de usuario.

Si alguien está interesado en mi versión del código, envíeme un mensaje y se lo enviaré.


Use socat para esto:

Por ejemplo:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11


Utilizando los enlaces publicados en las respuestas anteriores, codifiqué un pequeño ejemplo en C ++ utilizando un puerto serie virtual. Introduje el código en GitHub: https://github.com/cymait/virtual-serial-port-example .

El código es bastante auto explicativo. En primer lugar, crea el proceso maestro ejecutando ./main master e imprimirá en stderr el dispositivo está utilizando. Después de eso, invocará ./main dispositivo esclavo, donde dispositivo es el dispositivo impreso en el primer comando.

Y eso es. Tienes un enlace bidireccional entre los dos procesos.

Con este ejemplo, puede probar la aplicación enviando todo tipo de datos y ver si funciona correctamente.

Además, siempre puede vincular simbólicamente el dispositivo, por lo que no necesita volver a compilar la aplicación que está probando.


Puede usar pty ("pseudo-teletipo", donde un puerto serie es un "teletipo real") para esto. Desde un extremo, abra /dev/ptyp5 , y luego adjunte su programa a /dev/ttyp5 ; ttyp5 actuará como un puerto serie, pero enviará / recibirá todo lo que hace a través de / dev / ptyp5.

Si realmente lo necesita para hablar con un archivo llamado /dev/ttys2 , simplemente mueva su viejo /dev/ttys2 fuera del camino y haga un enlace simbólico desde ptyp5 a ptyp5 .

Por supuesto, puede usar un número que no sea ptyp5 . Quizás elija uno con un número alto para evitar duplicados, ya que todos sus terminales de inicio de sesión también usarán ptys.

Wikipedia tiene más información sobre ptys: http://en.wikipedia.org/wiki/Pseudo_terminal