c# serial-port listener sniffing

En C#, ¿cómo podría escuchar un puerto COM(en serie) que ya está abierto?



serial-port listener (4)

Estoy usando un programa que habla con mi puerto COMM, pero he creado otro programa que quiero "olfatear" los mensajes del puerto de comunicación y realizar sus propias acciones contra esos mensajes además. ¿Es esto posible en .NET c #?


Es posible olfatear el tráfico del puerto serie

Sin embargo, no parece haber un control "COMPortSniffer"

Una técnica válida utilizada por sysinternals se presenta allí

Parece depender de la programación de Win32, sin embargo, no creo que eso sea posible directamente con C #


Hay bibliotecas / herramientas / productos de terceros que exponen el tráfico que le interesa.

Este es uno que utilicé para la emulación de puertos serie, pero creo que proporciona algo que puede usar: http://com0com.sourceforge.net/


Si tiene control sobre el primer programa que le habla al puerto COM, ¿por qué no cambia el programa para pasar los datos recibidos desde el puerto al segundo programa suyo mediante comunicación remota o cualquier otro tipo de IPC? Mejor aún si puede escribir un programa proxy que esté conectado al puerto COMM, y tenga 2 del otro programa que hablen con este proxy para completar la comunicación.

Otra idea es, si necesita olfatear solo los datos entrantes, puede obtener un cable Y (divisor) y conectarse a un puerto COM 2, cada programa se conecta a cada puerto COM. Pero debes asegurarte de que el segundo programa no intente transmitir. En algunos casos, es posible que necesite un divisor que solo conecta el pin RX para la segunda salida. Avísame si necesitas el diagrama.

Si no tiene 2 COMM, puede obtener fácilmente un convertidor USB de serie por menos de USD10.


el proyecto de código ( http://www.codeproject.com/Articles/75770/Basic-serial-port-listening-application ) que tiene un gran tutorial sobre esto.

Muestra cómo leer los datos que ingresan desde un puerto en serie, y desde allí debe poder leer los datos.

Un pequeño fragmento:

void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { int dataLength = _serialPort.BytesToRead; byte[] data = new byte[dataLength]; int nbrDataRead = _serialPort.Read(data, 0, dataLength); if (nbrDataRead == 0) return; // Send data to whom ever interested if (NewSerialDataRecieved != null) NewSerialDataRecieved(this, new SerialDataEventArgs(data)); }