# Revisar los puertos RS232 abiertos en la PC



## Nepper (Nov 8, 2016)

Hola gente!

 Les comento que tengo un problema hace muchos años. Solo que ahora colmó mi paciencia.

 Resulta que trabajo mucho con puerto serie, no programando PIC, si no conectándome a muchos dispositivos industriales que tienen puerto serie.

 Como tengo muchos equipos, también cada uno tiene un software, así que tenemos instalados muchos software que usan el puerto serie en la misma PC.

 Ya de hace rato, tenemos problemas que un programa te "come" el puerto COM1 por decir algo.
 sabemos que si "Matamos" ese programa, después lo podemos usar sin problema.

 Como dije, durante años muchas veces reiniciaba la PC y se arreglaba, o mataba procesos hasta que ande, pero ahora no encuentro el proceso que lo desbloquee y reiniciando no funciona.

 ¿Existe alguna forma de saber qué software está ocupando el puerto?
 En la PC en cuestión tenemos Windows XP SP3.

 Probé con varios software de "Administración de Windows" pero ninguno me dice quien está usando el puerto serie.

 ¿Alguna idea?.

 Saludos!


----------



## DOSMETROS (Nov 8, 2016)

https://www.google.com.ar/webhp?sou...on=1&espv=2&ie=UTF-8#q=serial+port+monitoring


----------



## D@rkbytes (Nov 8, 2016)

Yo recomiendo éste: _PortMon_ de Sysinternals.


----------



## Ardogan (Nov 8, 2016)

Nepper dijo:


> Hola gente!
> ...Resulta que trabajo mucho con puerto serie...
> 
> Como tengo muchos equipos, también cada uno tiene un software, así que tenemos instalados muchos software que usan el puerto serie en la misma PC.
> ...



A ver que podemos hacer.
El puerto serie es un recurso que solo puede tomar 1 programa o aplicación a la vez.
Si abrís el com1 con el hiperterminal y a la vez querés abrir el mismo puerto com1 con otro programa a la vez, el sistema operativo te va a decir algo como "recurso no disponible" o algo así.
Entonces: naturaleza aleatoria recepción de datos =implica=>necesidad de mantener el puerto siempre abierto => no hay un close() al final de cada transacción => que solo un programa usa el puerto hasta que se de close() que es lo mismo que cerrar la aplicación.

Pero si matás la aplicación probablemente no esté cerrando apropiadamente el COM1, por lo tanto ese recurso queda asignado a un programa que ya no existe.

En esta página ejecutan el administrador de dispositivos con un comando inusual, que aparentemente permite mostrar dispositivos deshabilitados y desinstalarlos:
http://theitbros.com/how-to-delete-com-ports-in-use/
Extracto:


Abrir ventana de comando
Tipear: set devmgr_show_nonpresent_devices=1 <enter>
cd \Windows\system32 <enter>
start devmgmt.msc <enter>
Menú: View > Show hidden devices 
o Ver->Mostrar dispositivos ocultos (o algo así)
Buscar puerto "colgado", botón derecho -> uninstall o desinstalar
Algunos dicen que hace falta reiniciar la máquina... ojalá que no, no puedo probarlo yo mismo, no tengo WinXP.


Acá también veo que hay una herramienta gratuita ComDisable de Microsoft:
https://support.microsoft.com/en-us/kb/819036


También puede haber algún driver que permita compartir el puerto serie tomando 1 puerto serie de entrada COM4 por ejemplo, y creando varios COM5/6/7 "virtuales" pero que en realidad son el mismo puerto:
http://www.eltima.com/products/serialshare/

Y sino también se puede usar un hub usb con multiples cables usb<->rs232 y tener la maraña de cables, que supongo no será lo ideal pero no lo descartaría.

Bueno, demasiado largo, ojalá alguna de esas opciones sirva.
Saludos.


----------



## Nepper (Nov 8, 2016)

DOSMETROS dijo:


> https://www.google.com.ar/webhp?sou...on=1&espv=2&ie=UTF-8#q=serial+port+monitoring



Si dosme, lo intenté. Me descargué 3 softwares y ninguno dice que programa abre el puerto y los que lo hacen suelen ser $$$ 

Voy a probar con el portmon, ese no lo probé.

Ya probé con el Portmon. Ahora estoy en mi casa probando con la virtual, inicio un programa que sé que ocupa el COM1, cuando el programa está activo, el portmon me arroja error de "el puerto COM1 está siendo usado".

Así que apagué el programa, inicié el PortMon, seleccioné el puerto y ya no arrojó error.
Vuelvo a prender el programa y se me pone a monitorear perfectamente y me dice el programa que es 

Reinicié la máquina virtual y ahora el Portmon no me aparece ni la opción de conectarme T_T
(Esta en gris y no permite elegir el puerto). En el título dice "Not connected"

Probé otro, el Free Serial Port monitor, y el mismo efecto:
Mientras primero abras el Monitor y luego comience la comunicación, se podrá monitorear.

Si en caso contrario, se abre primero el puerto y luego se quiere monitorear, los Monitoreadores no podrán hacer su trabajo porque la seción ya está iniciada.


Me queda ir a probrarlos en el trabajo a ver que pasa.

Por lo que veo, si al inicio de la PC me copan el puerto, va a ser imposible monitorearlos...



Ardogan, recien leo lo tuyo, mas tarde pruebo o seguramente mañana...

gracias!


----------



## miguelus (Nov 8, 2016)

Buenas noches.

Hace alguno años necesité hacer unos controles por el Puerto Serie.

Me hice un pequeño programa en VB6.

Este programa funcionaba en XP SP3, pero creo que también funciona en Windows 8

Utiliza una DLL (Port.dll)

El programa detecta los Puertos Serie que hay en el PC (hasta un máximo de 4)

Detecta el estado de las líneas de entrada CTS, DSR, CDC, RI

Las líneas de salida DTR, RTS, TXD, las podemos activar independientemente.

Si puenteamos los Pines 2 y 3, podemos hacer un bucle para confirmar que el Puerto Transmite y Recibe correctamente.

En el fichero RAR está...

TestPort.exe, es el programa ejecutable
Port.dll, es la librería, tiene que estar junto al ejecutable.
Port.bas, son las entradas de la librería.

Sal U2


----------



## Nepper (Nov 8, 2016)

Ardogan dijo:


> En esta página ejecutan el administrador de dispositivos con un comando inusual, que aparentemente permite mostrar dispositivos deshabilitados y desinstalarlos:
> http://theitbros.com/how-to-delete-com-ports-in-use/
> Extracto:
> 
> ...


No anduvo, cuando inicia se reinstala (que no está mal) pero el programa lo ocupa inmediatamente cuando inicia.



Ardogan dijo:


> Acá también veo que hay una herramienta gratuita ComDisable de Microsoft:
> https://support.microsoft.com/en-us/kb/819036


Lo probé, pero en el XP no me toma la linea de comando..
Probé con comdisable /list pero "no es un archvido de lotes ejecutable y bla bla bla...




Ardogan dijo:


> También puede haber algún driver que permita compartir el puerto serie tomando 1 puerto serie de entrada COM4 por ejemplo, y creando varios COM5/6/7 "virtuales" pero que en realidad son el mismo puerto:
> http://www.eltima.com/products/serialshare/
> 
> Y sino también se puede usar un hub usb con multiples cables usb<->rs232 y tener la maraña de cables, que supongo no será lo ideal pero no lo descartaría.
> ...


No creo que sea una opción. Puede que funcione, pero no estaría resolviendo el problema.. 




miguelus dijo:


> Buenas noches.
> 
> Hace alguno años necesité hacer unos controles por el Puerto Serie.
> 
> ...


La verdad, muy bueno.
Pero se comporta de la misma forma que los otros. Cuando el programa que abre el puerto se apodera del mismo, el TestPort.exe ya no lo detecta como un puerto disponible. Así que me dice que no hay puertos disponibles.

Igualmente, funciona perfecto, cuando maté el "ocupador", tu programita detectó el puerto inmediatamente tal como lo describís en el post  
Espero que no te moleste que lo tome, porque me sirve tambien para ver rápidamente cual esta libre. (mis compañeros de trabajo a veces cambian el puerto y no me doy cuenta hasta un buen rato)

No quiero desviarme del tema. El objetivo es saber quien está ocupando el COM.

Una persona pregunta algo similar en el foro del PortMon.
http://forum.sysinternals.com/portmon-can-not-attach-to-serial0_topic2080.html

Le responden


> Yes. Process Explorer!
> 
> In portmon, say you try to connect to COM1 that is named Serial0 (from the Capture->Port menu); Just search for handle /Device/Serial0 in process exp, and you get it!



Yo no entendí... parece sencillo... pero lo busqué entre los procesos el Serial0 y no hay nada de eso...


----------



## miguelus (Nov 9, 2016)

Buenos días Nepper.

Comentas que...

_Pero se comporta de la misma forma que los otros. Cuando el programa que abre el puerto se apodera del mismo, el TestPort.exe ya no lo detecta como un puerto disponible. Así que me dice que no hay puertos disponibles_.

Pues la verdad que es así, el programa lo pensé para saber los Puertos disponibles 

Si alguna otra utilidad ha ocupado el Puerto la verdad es que no está disponible.

El saber qué utilidad está ocupando el Puerto lo veo complicado (yo no me he dedicado nunca a programar  )

En cualquier caso puedes hacer uso de esa utilidad como te venga en gana, incluso puedes omitir su procedencia.

Como verás, utilizando las 3 salidas, puedes activar o desactivar "algo" o utilizando las 4 entradas  puedes leer estados de "algo"

Sal U2


----------



## Nepper (Nov 9, 2016)

Buenos días gente!!

Bueno, probado en la PC en cuestión, el que terminó resultando fue como dijo adrogan.

Resulta que cuando lo instalé en la virtual, no me di cuenta (no le presté atención) a la ruta donde se instaló el ComDisable. Era un dato necesario, porque el comando no e ejecuta directamente del CMD, tenes que irte a la ruta del programa para usarlo.

Cuando lo instalé en la PC del trabajo, me mostró la ruta (cosa que ignoré en la virtual) y por las dudas tomé nota.

Entonces con el simple

```
cd "program files\microsof comDisable"
```

Pude acceder desde la linea de comandos al programa.

Me saltó que el único puerto era el COM3 y estaba deshabilitado/en uso/ocupado.

Lo habilito según instrucciones, y sigue sin funcionar. Lo habilito, deshabilito un par de veces y reinicio la PC.
Sigue sin funcionar.
Con la PC reiniciada, pruebo. sigue sin funcionar.

Vuelvo al ComDisable y lo muestra "enable", así que vuelvo a habilitarlo y deshabilitarlo un par de veces.
Parece no funcionar.

Entonces vuelvo al instructivo de "desinstalar el driver".
Desistalo el único port en cuestion (COM3) y reinicio la PC.

Con la PC reiniciada, ahora funciona correctamente, y encia el programa TestPort ahora me figuran 2 puertos, el COM1 y COM3...
Cosa que no está mal, porque tambien está el puerto paralelo de la PC, o tal vez algún que otro driver (bluethoot) que me hace aparecer otro COM

Así que ahora anda. Realmente no se me ocurrió desistalar los drivers para cortar los vinculos del puerto a los programas. Lo que solía hacer era cambiar el COM, cosa que si un programa ocupaba el 3 (por ejemplo) yo lo pasaba al COM22 y listo. Pero esta vez no anduvo mas, estaban TODOS los puertos ocupado. Por eso mi preocupación.

Así que caso resuelto.
Gracias a todos!!!


----------



## Ardogan (Nov 9, 2016)

Nepper dijo:


> No anduvo, cuando inicia se reinstala (que no está mal) pero el programa lo ocupa inmediatamente cuando inicia.



Eso me llama la atención, ¿o sea que sería un servicio/daemon que siempre toma el puerto?



Nepper dijo:


> ...
> Entonces vuelvo al instructivo de "desinstalar el driver".
> Desistalo el único port en cuestion (COM3) y reinicio la PC.
> 
> ...



Que lástima que estés obligado a reiniciar, todavía no termino de tener una idea cerrada de como es la situación.
¿O sea que es un programa que ni bien enchufas el puerto serie toma control del puerto y no lo larga nunca?. ¿Corre desde el inicio de Windows?. ¿Quizás está corriendo con privilegios mayores a las aplicaciones normales y de ahí la historia?
O si es el mismo equipo con conexión serie que se usa con distintos programas, ¿no tendrás un problema de drivers en el sentido de que cada programa trae/instala su propio driver y al enchufar el aparato Windows elige el que se instaló en último lugar?.


Mmmmm... capaz que con el administrador de dispositivos reinstalando el driver y especificando el .sys o .inf o lo que sea (ya no recuerdo) manualmente (el que utilice el programa que deseas ejecutar luego de reinstalar driver) puede funcionar.
A lo mejor el proceso es: enchufar equipo, abrir/usar programa1, cerrar programa1, resintalar driver2, desenchufar equipo, enchufar, abrir/usar programa 2, cerrar programa2, desinstalar driver2 o re-instalar driver3, desenchufar, enchufar, abrir/usar programa 3....

Bueno, de todas formas ya está resuelto así que solo serviría para mi curiosidad  , sin obligación de respuesta .


----------



## Nepper (Nov 9, 2016)

El tema es así, yo uso un programa llamado Rslinx.
Este es un programa que se conecta a los PLC. Luego, el programa para programar los PLC usa al RSlinx para comunicarse al PLC, de esta forma gestionas todas las conexiones con el RSlinx y no con el programador.
Cuando creas una conexión, le configuras que va a ser del tipo RS232 y usará el puerto COM1.
Si el COM está libre, lo seleccionará y hará un chequeo. Si esta ocupado, arroja error.
Solo aparece el puerto físico que existe, dicho de otra forma, solo aparece COM1 en la lista.
Cuando lo seleccionaba, arrojaba error de que estaba ocupado.

Esto muchas veces era normal porque otro programa para parametrizar soldadura usa el COM.
Particularmente el RSlinx, una vez que lo configuraste pasa usar ese puerto, tengas o no conectado el PLC, este lo ocupa y no lo suelta.
Con el programa de soldadura es distinto, al queres establecer conexión, si no lo usa, lo cierra y sigue con la siguiente pantalla indicando que no se pudo conectar.
Además el RSlinx al cerrarlo, queda como un proceso y mantiene ocupado el puerto siempre. Por eso, si quiero usar la soldadora, suelo "Matar" el RSlinx, para que libere el puerto.

Con los años se fueron agregando versiones de otros programas (varios PLC traen su propio programa y gestor de conexión) y algunos que otros usan USB-serie. Por ejemplo, otra marca de PLC, otras soldadoras, Drivers, etc. Estos programas que usan el USB-serie, cuando se les quita el USB-Serie pasan a tener como única opción el COM1 de la PC. La demanda que comienza a tener el COM1 sube.

Lo normal, es que el RSlinx lidere sobre el resto de los softwares. Generalmente siempre era el RSlinx quien estaba ocupando el puerto y no otro programa.
En el peor de los casos (cuando no andaba nada, no sabía a quien matar), con solo reiniciar la PC se liberaba todo, y el primero en tomar el puerto siempre era el RSlinx.

Esta vez fue distinto. El RSlinx no me aceptaba NINGÚN puerto válido, reiniciando o no la PC. Maté procesos de los que podrían usar el serie pero nada.
Casualmente, compañeros míos hace un par de semanas me dijeron que les resultó imposible conectarse a los equipos, cosa que es muy raro, porque años que estuve con ellos (y con esa misma PC) nunca pasó. Recordando que mis colegas ya no podían conectarse a las soldadoras y yo tampoco podía al PLC (justamente, pensé que el PLC les estaba ocupando el puerto) entonces comencé a preocuparme, porque no tenía forma, con ningun programa, ver quien lo estaba ocupando o por que no me dejaba usarlo.

Eso es a grandes rasgos la historia...


----------



## Ardogan (Nov 10, 2016)

Nepper dijo:


> ....



Aaaaahh, ahora la cosa es más jugosa.
Alguien (hay pasantes? ) quizás haya instalado o actualizado algo (SO, aplicación, driver) sin decir nada, que resulte en algún conflicto de drivers.

Desde un punto de visto de mantenimiento... PC con Win pelado, instalarle los programas de a uno y ver si al ir agregando funciona todo o no. Que puede no ser posible claro.

El programa Rslinx... mirando por arriba (Cap. 5 pagina 27/55) veo que instala su propio driver de puerto serie y luego usa un servidor DDE para mandar datos a otras aplicaciones. Alguna vez jugué con usar alguno con Delphi en Windows... 98? (me salió un manojo de canas nuevo cuando dije eso).
Claro... debe pasar que hay un programa de fondo/servicio que inicia el servidor DDE (que correría siempre) toma el puerto serie COM y no lo larga, por más que uno cierre la interfaz gráfica de administración.

Ufffff.... y si, ya la cosa depende mucho del setup particular, de los programas, de los drivers, de la configuración, etc. Y si hay cables USB-serie en el medio es otro drama, porque ahí también se mete el driver del cable...
https://www.theautomationstore.com/...-over-a-serial-port-or-usb-to-serial-adapter/

Me temo que con toda esa info nueva que diste no tengo ninguna solución más refinada que aportar .
Pero bueno, ese panorama pinta mejor la situación, aunque más no sea para saber los problemas cotidianos que hay.

Saludos.


----------



## GarryMann (Ene 8, 2020)

Estoy ingeniería inversa un protocolo serie y frustrado por malas herramientas. ¿Alguien sabe de una buena herramienta gratuita para registrar datos a / desde puertos serie en Windows?

Requisitos:
No debe tomar el control del puerto (es decir, debe enganchar las API de archivo o el núcleo en lugar de intentar abrir el dispositivo)
Debe tener algún tipo de características de filtrado
Escribe registros binarios o legibles para humanos, preferiblemente en un formato fácil de analizar
¿Algunas ideas? ¿Quién ha probado una herramienta comercial de esto?Mejor monitor de puerto serie ?


----------



## DJ T3 (Ene 8, 2020)

Necesitas solo software o puede ser por hardware?
Que dispositivo es el que quieres analizar? Quizas ya haya en internet el protocolo de comunicacion


----------



## GarryMann (Ene 8, 2020)

Estoy buscando una opción de software. El hardware no me conviene.
Intento trabajar con Portmon funciona, pero sus registros son difíciles de trabajar y sus filtros son efectivamente inútiles


----------



## Dr. Zoidberg (Ene 8, 2020)

Si podes conectar un cable serie con in extremo en Y entonces hay un soft gratuito que te permite capturar todo el trafico.


----------



## cubiella (Mar 2, 2020)

Les recomiendo el *franson gpsgate 2.6 *si bien en su mayoria de cosas dice que es para sentencias NMEA pues no le crean, puede usarse para cualquier cosa, les recomiendo que le den 2 minutos y veran las cosas que pueden hacer...
- de un puerto físico crear cuantos puertos virtuales quieran
- compartir un puerto físico por TCP/IP (Cliente Servidor)
- compartir un puerto físico por UDP
- Crear puertos virtuales

En fin son muchas las cosas que se pueden hacer. Para mi de los mejores programas para  gestionar puertos COM. Y con una pequeña rutina que eh creado en python hasta se puede gestionar por software propio las creaciones de los puertos ya que los archivos de configuración que usa con xml.


----------

