visual studio serial read open example ejemplo datareceived com1 c# .net serial-port

c# - studio - SerialPort a veces se cuelga en el cierre



uart c# (2)

Estoy desarrollando una aplicación .NET 4.0 WPF en C # que controla un motor a través de RS232. Estoy teniendo problemas al salir de mi aplicación que la aplicación a veces se bloquea al cerrar el paquete.

Después de algunas investigaciones en Internet noté que este era un problema común y que usar BeginInvoke en DataReceivedEvent o cerrar el puerto serie en un hilo diferente debería resolver el problema. El problema con esas soluciones es eso. 1. No uso DataReceiveEvent. 2. cerrar el puerto serial en otro hilo no hace ninguna diferencia. Lo que sucede es que la GUI se apaga, pero puede ver en el Administrador de tareas que el proceso aún se está ejecutando.

Otras cosas que he intentado es:

  • No cierra el puerto serial y acaba de salir de la aplicación. Esto cierra con éxito la aplicación y el proceso, pero el puerto serie todavía está bloqueado, y para desbloquear el puerto serie necesito reiniciar la computadora.
  • Dormir un par de segundos antes y después de cerrar el puerto serial.
  • Tener la aplicación sea una aplicación WinForms. en lugar de WPF No hay diferencia en el punto muerto entre los dos.

La computadora en la que ejecuto el programa usa com puertos que están montados en la placa madre y tienen controladores de Microsoft.

Y ahora por algún código:

El evento Window_Closing se ve así:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { window.Closing -= Window_Closing; Thread CloseDown = new Thread(new ThreadStart(server.Dispose)); //Closes serialport everything in another thread to avoid hang on serialport close. CloseDown.Start(); }

Donde server es el objeto que gestiona el puerto serie. Y Dispose llama a la función de cierre serialport.

Función de cierre de Serialport:

public void Close() { DebugLog.Write(3, "-->MacCommSerialPort.Close"); _com.Close(); DebugLog.Write(3, "<--MacCommSerialPort.Close"); }

Configuración de puerto de serie:

_com = new SerialPort(portNumber); _com.BaudRate = 19200; _com.Parity = Parity.None; _com.DataBits = 8; _com.Encoding = Encoding.GetEncoding("Windows-1252"); _com.StopBits = StopBits.One; _com.RtsEnable = false; _com.DtrEnable = false; _com.WriteTimeout = 400; _com.ReadTimeout = 1000;


Acabo de ver su código y supongo que debería usar el evento AutoThreadRest antes de cerrar su GUI.

private static AutoResetEvent PortClosedEvent = new AutoResetEvent(false); private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { window.Closing -= Window_Closing; Thread CloseDown = new Thread(new ThreadStart(server.Dispose)); CloseDown.Start(); PortClosedEvent.WaitOne(); }

y dentro del servidor. Método de eliminación una vez que haya terminado de deshacerse de la conexión agregue esta línea de código a continuación.

PortClosedEvent.Set();


Verificaría para asegurarse de que el protocolo de handshaking entre su aplicación y el motor (es decir, el emisor y el receptor) coincida.