serialport serial read open example ejemplo datareceived com1 c# winforms serial-port

read - C#: forma correcta de cerrar SerialPort con Winforms



serial port configuration c# (4)

Puerto serie se bloquea al cerrar

Este es un problema conocido con la clase SerialPort y se describe en este artículo de Comentarios del producto , así como en varios hilos en estos foros. Puede notar el despido "cerrado por diseño".

Tengo una aplicación donde leo desde el puerto serie, todo va bien, hasta que cierro la aplicación. Cuando hago clic en [X] la aplicación simplemente se cuelga, la IU: no responde.

Leo desde el puerto en el controlador de eventos DataReceived, y cierro el puerto cuando ocurre FormClosed:

private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { mySerialPort.Close(); }


No es un error.

La única razón por la que se colgaría al cerrarla es porque en el controlador de eventos de su objeto SerialPort, está sincronizando una llamada con el hilo principal (generalmente llamando a invocar). El método de cierre de SerialPort espera que su subproceso EventLoopRunner desencadene los eventos DataReceived / Error / PinChanged, pero dado que su propio código en el evento también está esperando la respuesta del subproceso principal, se encontrará con una situación de bloqueo inactivo.

La razón por la que el informe de error se cerró ''como se diseñó'' es porque el ''error'' está en su propio código.


La solución más simple si solo quiere cerrar el puerto cuando se cierra la aplicación, es simplemente no molestarse en Cerrar () el puerto. El puerto aún se cerrará cuando la aplicación disponga del puerto serie. El puerto estará disponible para ser abierto nuevamente por su aplicación cuando se reinicie o por otras aplicaciones que deseen usar el puerto.


Si su aplicación llama a Invoke para procesar los datos recibidos, intente llamar a BeginInvoke.

En lugar de:

this.Invoke(d, new object[] { s, tb });

utilizar:

this.BeginInvoke(d, new object[] { s, tb });