He modificado nombre de las variables y lo he adaptado el Windows Form .net 4.8 al .net 8.0.
Me sale este error: Puerto cerrado.
Código
using System.IO.Ports; namespace Termite_SAI_05_.NET_8._0 { public partial class Form1 : Form { SerialPort puertoSerie; bool verComandoBFlag = false; bool verComandoX72Flag = false; readonly string verComandoBReq = "B\r"; readonly string verComandoX72Req = "X72\r"; private void Form1_Load(object sender, EventArgs e) { } public Form1() { InitializeComponent(); InitSerialPort(); } /* Iniciar y configurar el puerto serie */ private void InitSerialPort() { try { Parity.None, 8, StopBits.One) { Handshake = Handshake.None, ReadTimeout = 500, WriteTimeout = 500, DtrEnable = true, RtsEnable = true }; // Subscribir el evento Sp_DataReceived cuando lleguen datos puertoSerie.DataReceived += Sp_DataReceived; } catch (Exception ex) { MessageBox.Show(ex.Message); puertoSerie.Close(); // Cierra el puerto en caso de error } } /* Evento para leer asíncronamente datos del puerto serie */ void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (puertoSerie.IsOpen) { Task.Run(async () => { try { await Task.Delay(500); // Pausa para recibir datos string str = puertoSerie.ReadExisting(); if (!String.IsNullOrEmpty(str)) { if (verComandoBFlag) { ProcessverComandoBReq(str); } if (verComandoX72Flag) { ProcessverComandoX72Req(str); } } else { Console.Write("Datos leídos corruptos."); } } catch (IndexOutOfRangeException ex) { Console.Write("Índice fuera de los límites de la matriz."); MessageBox.Show(ex.Message); } catch (FormatException ex) { Console.Write("La cadena de entrada no tiene el formato correcto."); MessageBox.Show(ex.Message, "Error"); } }); } } /* Procesar verComandoX72Req */ private void ProcessverComandoX72Req(string str) { verComandoX72Flag = false; char[] separadores = { '#', ',' }; string[] salida = str.Split(separadores, StringSplitOptions.RemoveEmptyEntries); // Al manipular controles de Windows Forms desde un hilo diferente al // hilo de la interfaz de usuario, es necesario usar Invoke para evitar problemas de concurrencia if (InvokeRequired) { { UpdateUIControlsVerTabla(salida); })); } else { UpdateUIControlsVerTabla(salida); } } /* Procesar verComandoBReq */ private void ProcessverComandoBReq(string str) { verComandoBFlag = false; char[] separadores = { '#', 'I', 'O', 'L', 'B', 'V', 'F', 'H', 'R', 'S', '\r'}; string[] salida = str.Split(separadores, StringSplitOptions.RemoveEmptyEntries); // Al manipular controles de Windows Forms desde un hilo diferente al // hilo de la interfaz de usuario, es necesario usar Invoke para evitar problemas de concurrencia if (InvokeRequired) { { UpdateUIControlsVerDatos(salida); })); } else { UpdateUIControlsVerDatos(salida); } } /* Mostrar datos verComandoX72Req */ private void UpdateUIControlsVerTabla(string[] salida) { label_Resultado_valores_nonimales_de_alimentacion.Text = salida[0] + " VA / " + salida[1] + " W"; label_Resultado_voltaje_nominal.Text = salida[2] + " Vac"; label_Resultado_corriente_nominal.Text = salida[5] + " A"; label_Resultado_valores_nominales_de_frecuencia.Text = salida[3] + " ~ " + salida[4] + " Hz"; } /* Mostrar datos verComandoBReq */ private void UpdateUIControlsVerDatos(string[] salida) { label_I.Text = salida[0] + " Vac"; label_O.Text = salida[1] + " Vac"; label_L.Text = salida[2].TrimStart('0') + " %"; // Quita los ceros de la izquierda. label_B.Text = salida[3] + " %"; label_V.Text = salida[4] + " Vdc"; label_F.Text = salida[5].PadRight(5, '0') + " Hz"; // Añade ceros a la derecha. label_H.Text = salida[6].PadRight(5, '0') + " Hz"; // Convertir variable tipo string a tipo int, es decir, la variable tipo string "salida[7]" // se convierte en tipo int "resultadoSalida7". int resultadoSalida7 = Int32.Parse(salida[7]); #region Horas y minutos. // Cálculos. int horas = resultadoSalida7 / 60; int minutos = resultadoSalida7 % 60; // ¿0 horas y 1 minuto? if ((horas == 0) && (minutos == 1)) { label_R.Text = $"{minutos} minuto."; } // ¿0 horas y 0 minuto? if ((horas == 0) && (minutos == 0)) { label_R.Text = $"{minutos} minutos"; } // ¿0 horas y más de 1 minuto? if ((horas == 0) && (minutos > 1)) { label_R.Text = $"{minutos} minutos."; } // ¿1 hora y 0 minutos? if ((horas == 1) && (minutos == 0)) { label_R.Text = $"{horas} hora."; } // ¿Más de una hora y 0 minutos? if ((horas > 1) && (minutos == 0)) { label_R.Text = $"{horas} horas."; } // ¿1 hora y 1 minuto? if ((horas == 1) && (minutos == 1)) { label_R.Text = $"{horas} hora y {minutos} minuto"; } // ¿1 hora y más de 1 minuto? if ((horas == 1) && (minutos > 1)) { label_R.Text = $"{horas} hora y {minutos} minutos."; } // ¿Más de 1 hora y 1 minuto? if ((horas > 1) && (minutos == 1)) { label_R.Text = $"{horas} horas y {minutos} minuto."; } // ¿Más de 1 horas y más de 1 minuto? if ((horas > 1) && (minutos > 1)) { label_R.Text = $"{horas} horas y {minutos} minutos."; } #endregion } /* Evento de botón: Abrir puerto serie y mandar "B" */ private void button_Comando_B_Click(object sender, EventArgs e) { if (puertoSerie.IsOpen) { verComandoBFlag = true; puertoSerie.Open(); puertoSerie.Write(verComandoBReq); } else { MessageBox.Show("Puerto cerrado. " + "No se puede solicitar datos."); } } /* Evento de botón: Abrir puerto serie y mandar "X72" */ private void button1_Click(object sender, EventArgs e) { if (puertoSerie.IsOpen) { verComandoX72Flag = true; puertoSerie.Open(); puertoSerie.Write(verComandoX72Req); } else { MessageBox.Show("Puerto cerrado. " + "No se puede enviar datos."); } } } }
Algo pasa que no me deja abrir el puerto.