usar serie serial rs232 puertos puerto para obtener listar leer exportar datos comunicacion c# serial-port simulation

serie - obtener datos de arduino c#



¿Cómo puedo simular las interacciones de SerialPort para las pruebas? (6)

Estoy a punto de comenzar a desarrollar una pequeña aplicación (C #) que se comunica con un PLC y una unidad de prueba a través de puertos serie. Esta es mi primera incursión en esta área.

En esencia, enviaré una señal al PLC para iniciar una operación, y luego esperaré el resultado de esa operación de la unidad de prueba (que se comunicará independientemente con el PLC) para devolver una cadena ASCII.

Dependiendo del contenido de esa cadena, es posible que desee escuchar una señal del PLC ...

Todo es nuevo para mí, por lo que en este momento solo estoy investigando System.IO.Ports.SerialPort; digresión: ¿hay productos de terceros que simplifiquen la interacción con el puerto serie , o las clases integradas son tan buenas como las que obtendrá? Estoy pensando en la facilidad de uso en lugar de mejores características.

Sin embargo, pasarán unas semanas antes de que el hardware esté disponible para desarrollo y pruebas, por lo que me preguntaba cómo podría simular la comunicación hacia / desde el puerto serie para poder comenzar a desarrollar mi aplicación.

[Todavía no sé cómo se deben comunicar el PLC y la PC; entiendo que será binario en lugar de texto, pero en este momento, eso es todo lo que sé]


Escribí un article sobre este tema utilizando el estándar del controlador de puerto serie virtual 9.0 utilizando la clase SerialPort de Microsoft (Sytem.IO.Ports); por supuesto, es posible utilizar cualquier otra herramienta de puerto de comunicaciones.

En el software creo 2 puertos virtuales COM1 y COM2.

Yo uso COM1 para emular como remitente de datos.

Utilizo COM2 para recibir lo que se haya enviado desde COM1.

Esto es útil si está desarrollando una solución Embedded o IoT.

Emulador (en este ejemplo como acelerómetro aleatorio)

private static bool _continue; private static SerialPort _serialPort; public static void Main() { var stringComparer = StringComparer.OrdinalIgnoreCase; var readThread = new Thread(Read); _serialPort = new SerialPort { PortName = "COM1", ReadTimeout = 500, WriteTimeout = 500 }; _serialPort.Open(); _continue = true; readThread.Start(); while (_continue) { var x = ValueGenerator(); var y = ValueGenerator(); var z = ValueGenerator(); var message = $"x:{x};y:{y};z:{z}"; if (stringComparer.Equals("quit", message)) { _continue = false; } else { _serialPort.WriteLine(message); Thread.Sleep(200); } } readThread.Join(); _serialPort.Close(); } public static double ValueGenerator() { const int range = 1; var random = new Random(); return random.NextDouble() * range; } public static void Read() { while (_continue) { try { var message = _serialPort.ReadLine(); Console.WriteLine(message); } catch (TimeoutException) { } } }

Y mi receptor de datos es casi similar.

private static bool _continue; private static SerialPort _serialPort; public static void Main() { var stringComparer = StringComparer.OrdinalIgnoreCase; var readThread = new Thread(Read); _serialPort = new SerialPort { PortName = "COM2", ReadTimeout = 500, WriteTimeout = 500 }; _serialPort.Open(); _continue = true; readThread.Start(); while (_continue) { var message = Console.ReadLine(); if (stringComparer.Equals("quit", message)) { _continue = false; } else { _serialPort.WriteLine(message); } } readThread.Join(); _serialPort.Close(); } public static void Read() { while (_continue) { try { var message = _serialPort.ReadLine(); Console.WriteLine(message); } catch (TimeoutException) { } } }

Descargo de responsabilidad: el enlace de esta guía se refiere a mi sitio web personal.


Hay dos piezas de software que he encontrado de gran valor al hacer el trabajo de puerto serie.

Monitor de puerto serie gratis

http://www.serial-port-monitor.com

A pesar del nombre cursi, en realidad es bastante útil. Tenga en cuenta que debe dejar de escuchar su puerto si va a desconectar un convertidor de USB a serie. De lo contrario, puede fallar (bueno ... esperar indefinidamente en la salida, lo cual es molesto). No tiene que ponerse en medio de una conexión en serie para rastrear datos. Supervisa el IO utilizando la API de Win32.

Herramientas de puerto serie Franson

http://franson.com/serialtools/

O ... cualquier software de loopback realmente. Hay muchos por ahí. Esto le permite enviar datos y recibirlos dentro del software. Si terminas haciendo algún trabajo de GPS, Franson también tiene un simulador de GPS agradable para que no tengas que quedarte fuera todo el tiempo para depurar el código.

Finalmente, si ya ha tenido suficiente con la clase serial incorporada y sus horrendas deficiencias, entonces necesita un reemplazo, e ir directamente a la API de Win32 tomará una eternidad.

Estudio de comunicación

He encontrado que CommStudio es absolutamente sólido como una roca. Francamente, después de pasar 5 meses investigando y comprando otras opciones, es la única que funciona perfectamente con los adaptadores USB extraíbles. Todas las demás soluciones tienen problemas cuando se vuelve a conectar el dispositivo. Puede descargar su versión gratuita "Express" aquí: http://www.componentsource.com/products/commstudio/downloads.html?rv=42917


Hay otro recurso por ahí que emula puertos serie para Windows si alguien más todavía está buscando herramientas de depuración en serie decentes.

La versión de 32 bits es gratuita y parece bastante decente. Se llama Virtual Serial Ports Emulator .


He tenido algún éxito en el pasado usando com0com .


Me gusta la respuesta de David anterior, pero si está buscando hacer pruebas de integración y probar su comunicación de puerto serie, en el pasado usé una aplicación llamada ViN soft virtual serial cable para crear básicamente 2 puertos serie en su máquina que están conectados mediante un cable virtual .

Además, si tiene un puerto serie en su máquina de desarrollo, podría usarlo para conectarse a otra máquina que tenga un puerto serie y escribir una aplicación que básicamente simule la comunicación del PLC.

Preferiría usar una combinación del método de David y este método para asegurar una prueba adecuada.


Resuma las comunicaciones de su puerto serie detrás de una interfaz para que pueda codificar su aplicación contra la interfaz y luego probar con una implementación ''falsa''. Cuando tiene el hardware para la realidad, puede codificar la implementación "real" de la interfaz y cambiar la falsa.

Así, por ejemplo, tendrías una interfaz.

public interface ISerialComms { void SendMessage(string message) }

y codificarías tu aplicación contra esa interfaz usando una implementación falsa:

public class FakeSerialComms : ISerialComms { public void SendMessage(string message) { //some implementation } }

¡Espero que ayude!