2012-08-27 28 views
14

Aquí está el código que lee los datos de un puerto en serie. Para mantener las cosas simples, hagámoslo con un clic de botón;Error de comunicación del puerto serie, "El recurso solicitado está en uso".

private System.IO.Ports.SerialPort serialPort; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (serialPort == null) 
      serialPort = new SerialPort("COM7", 4800, Parity.None, 8, StopBits.One); 
      //COM7 is hard coded just for the sake of example 

     if (!serialPort.IsOpen) 
      serialPort.Open(); 

     textBox1.AppendText(serialPort.ReadExisting()); 
    } 

El código funciona perfectamente bien a menos que mi computadora portátil se quede dormida. Cuando el sistema se despierta de la suspensión, el objeto serialPort no es null, pero serialPort.IsOpen devuelve false y aparece el error "El recurso solicitado está en uso". al llamar al serialPort.Open(). No hay nada en la excepción interna. enter image description here

He intentado muchas cosas con serialPort objeto como cerrar, eliminar o asignarlo explícitamente a nulo y reinicialización, pero no sirve de nada, el mismo error en la misma línea todo el tiempo.

 if (!serialPort.IsOpen) 
     { 
      try 
      { 
       serialPort.Open(); 
      } 
      catch 
      { 
       serialPort.Close(); 
       serialPort.Dispose(); 
       serialPort = null; 

       serialPort = new SerialPort("COM7", 4800, Parity.None, 8, StopBits.One); 
       serialPort.Open(); 
      } 
     } 

también he intentado serialPort.DataReceived evento, pero el evento no se dispara una vez que el sistema se despertó en marcha del sueño.

La única solución consiste en detener la aplicación y ejecutarla de nuevo. Realmente apreciaré si alguien me da una pista para resolverlo de una manera decente.

+1

Bien se podría tratar de cerrar la conexión cuando el sistema se va a dormir y tratar de reabrir el curriculum vitae. – Reniuz

+0

¿Utiliza un puerto serie real o algún tipo de emulación de puerto? Pruebe este programa en un puerto serie real. –

+0

@AlexFarber Es un puerto serie real, un dispositivo GPS está conectado a él. – ABH

Respuesta

8

Como he sugerido en el comentario la solución podría hacerse mediante el uso de SystemEvents.PowerModeChanged caso de detectar cuando el sistema está a punto de suspender. Cuando se detecta ese estado, debe cerrar el puerto serie y volver a abrirlo cuando el sistema operativo esté a punto de reanudarse desde un estado suspendido.

Hamad confirmó que esta solución funciona.

Aquí está el código.

SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; 

void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) 
{ 
    if (e.Mode != PowerModes.Resume) 
     serialPort.Close(); 
} 

También tenga en cuenta a partir de la documentación del evento:

Precaución

Debido a que este es un evento estático, debe separar sus controladores de eventos cuando se dispone su aplicación, o la memoria se producirán fugas.

+0

Gracias por la ayuda :) – ABH

Cuestiones relacionadas