La Web del Programador: Comunidad de Programadores
 
    Pregunta:  26787 - ES POSIBLE LIBERAR COM SERIE OCUPADO POR APLICACION CERRADA
Autor:  Josep Selles
He programado una aplicación windows que utiliza el control ActiveX communications de microsoft. Esta aplicación tiene que ser utilizada siempre despues de otra aplicación que corre bajo MS-DOS y que también utiliza el puerto serie (debe ser el mismo puerto).Esta aplicacion MS-DOS se ejecuta desde el mismo Windows.

El proceso siempre es: utilizo la aplicación MS-DOS que envia informacion a traves del puerto serie, cierro la aplicación (cierro la ventana MS-DOS que se abrió en windows) y, a continuación, arranco mi aplicación Windows.... el prblema es que me encuentro con que no puedo abrir el puerto serie porque me dice que está ocupado...

Estoy seguro que la aplicación MS-DOS esta cerrada, pero al parecer deja algún recurso ocupado que hace que el control de comunicaciones de mi aplicación detecte que el puerto está siendo utilizado.

Mi pregunta es si desde mi aplicación Windows puedo liberar el puerto de comunicaciones que ha abierto otra aplicación, al menos en este caso en que la antigua aplicación ha dejado de existir.

No sé si no utilizando el control este de comunicaciones de microsoft me evitaría este problema, es decir, utilizando para mis comunicaciones serie las tipicas funciones del API de Windows (CreateFile, etc...). Quizás de esta forma no detectaría el puerto ocupado y si me dejaría utilizarlo.

Para dar más datos, os diré que mi aplicación corre en Windows 9X y está hecha con MFC.

Bueno, agradezco de antemano vuestra atención y espero que alguién pueda orientarme algo... gracias
Josep Sellés

  Respuesta:  Jose angel Cañas Martinez
Yo tenia el mismo problema con una aplicacion que recibia del serie mediante un hilo. Justo antes de cerrar la aplicacion, cerraba el hilo. El problema estaba en que la aplicacion se cerraba antes de finalizar el hilo (la recepcion la hacia mediante eventos, WaitCommEvent()), quedandose éste huerfano y con el puerto cogido. Lo solucioné poniendo un pequeño retardo detras del cierre del hilo, para darle tiempo a que se cerrase antes de que se cerrase la aplicacion.
Si esto no te funciona y puedes averiguar el pid de la aplicacion de MS-DOS (si la ejecutas sobre windows, éste le asignará uno), con TerminateProcess() lo puedes matas tambien desde la otra aplicacion.

Espero te sirva de algo
Un saludo

  Respuesta:  Carmelo
En teoría no deberías tener ningún problema en que tu aplicacion Windows abra el puerto, a mi a veces me ha pasado que sino cierras totalmente la ventana donde se ejecuta la aplicación MS-DOS el
puerto no se libera, es decir te encuentras que el programa ha finalizado pero la ventana se mantiene.
También deberías especificar como realizas toda la operacion de cerrado y apertura de los programas, si lo haces manualmente o automatizado.
Los primeros programas que hice para el puerto serie los hice para MS-DOS desde el TC, luego en windows me pasé al VB y usé el control que microsoft destribuye el MSCommm y ahora definitivamente uso la api de windows con la librería MFC y para mí esta última opcion es sin duda la más cómoda y la mejor.
En este link encontrarás toda la información necesaria sobre la api y sobre el puerto serie, vale la pena http://pb.uv.es/pedrom/pedrom.htm.

Un saludo