Pregunta

Tengo una aplicación que debe funcionar después de otra aplicación. Esta segunda aplicación tiene un error que hace que los puertos COM no se cierren en circunstancias específicas.

Me gustaría cerrar todos los puertos COM mediante programación en mi aplicación para asegurarme de que no se informarán errores sobre los puertos cercanos. ¿Es posible si no poseo objetos que abrieron puertos COM?

Necesito una solución en .NET Framework, C #.

¿Fue útil?

Solución

No hay una manera buena y fácil:

  • Una forma buena es arreglar la otra aplicación; o si eso es imposible, escribir un controlador de dispositivo de filtro (similar al controlador de parport pero para puertos serie en lugar de puertos paralelos) que se ubicaría encima del controlador de hardware del puerto serie y que expondría más de un punto de conexión (uno utilizado por la otra aplicación, que pasa al controlador real subyacente, y otra 'puerta trasera' utilizada por su propia aplicación ... el controlador real solo vería un cliente, es decir, el controlador de filtro que se encuentra encima de él)
  • Una forma fácil es atacar (terminar por la fuerza) el otro proceso.

Otros consejos

Me encontré con esto recientemente y tengo un poco que agregar ... La mayoría de los controladores de puerto COM "desbloquean" el puerto cuando el dispositivo está habilitado y deshabilitado en el administrador de dispositivos. Esto significa que la forma (C #) de realizar esta tarea se describe en la solución:

Función Win32 API para habilitar / deshabilitar mediante programación el dispositivo

La información que necesita saber para usar esa solución para puertos COM es:

  1. el GUID para puertos COM: {4d36e978-e325-11ce-bfc1-08002be10318} (CLSID_Ports)
  2. la " ruta de instancia " del puerto que desea restablecer

Dado que dice que desea restablecer todos los puertos, debe modificar la biblioteca en ese ejemplo para recorrer todos los puertos cambiando:

// Find the index of our instance. i.e. the touchpad mouse - I have 3 mice attached...
int index = GetIndexOfInstance(diSetHandle, diData, instanceId);
// Disable...
EnableDevice(diSetHandle, diData[index], enable);

a algo como esto:

for (int index = 0; index < diData.Length; index++)
{
    EnableDevice(diSetHandle, diData[index], enable);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top