Autor
|
Tema: Recibir dos tramas por RS232 diferentes. (Leído 10,039 veces)
|
Meta
|
Hola: Puedo recibir tramas de bytes por el puerto serie, una es esta si envía este comando: serialPort1.Write("B\r"); #I230.3O230.0L007B100V25.7F50.2H50.2R0080S„€ˆ„Ày la otra es esta si envías este otro comando diferente: serialPort1.Write("X72\r"); #2000,1400,230,45.0,55.0,8.6En la primera tengo el código hecho en Windows Form y funciona. using System; using System.IO.Ports; using System.Threading; using System.Windows.Forms;
namespace Termite_SAI_04 { public partial class Form1 : Form { private delegate void DelegadoAcceso(String accion); public Form1() { InitializeComponent(); }
private void button_Ver_datos_Click(object sender, EventArgs e) { serialPort1.Write("B\r"); }
private void button_Ver_Tabla_Click(object sender, EventArgs e) { serialPort1.Write("X72\r"); }
private void Form1_Load(object sender, EventArgs e) { try { serialPort1 = new SerialPort("COM3", 2400, Parity.None, 8, StopBits.One); serialPort1.Handshake = Handshake.None; serialPort1.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); serialPort1.ReadTimeout = 500; serialPort1.WriteTimeout = 500; serialPort1.Open(); serialPort1.Write("B\r"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (this.Enabled == true) { Thread.Sleep(500); string entrada = serialPort1.ReadExisting(); this.BeginInvoke(new DelegadoAcceso(si_DataReceived), new object[] { entrada }); //serialPort1.Write("B\r"); // Envía comando. } }
private void si_DataReceived(string accion) { try { char[] separadores = { '#', 'I', 'O', 'L', 'B', 'V', 'F', 'H', 'R', 'S' };
string[] salida = accion.Split(separadores, StringSplitOptions.RemoveEmptyEntries);
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]);
// ¿Es igual a 1 minuto? if ((resultadoSalida7 % 60) == 1) { label_R.Text = resultadoSalida7 / 60 + " hora y " + resultadoSalida7 % 60 + " minuto."; }
// ¿Es mayor a 60 segundos o 1 minuto? if ((resultadoSalida7 % 60) > 1) { label_R.Text = resultadoSalida7 / 60 + " hora y " + resultadoSalida7 % 60 + " minutos."; }
// ¿Es igual a 60 segundos o 1 minuto? if ((resultadoSalida7 % 60) == 0) { label_R.Text = resultadoSalida7 / 60 + " hora y " + resultadoSalida7 % 60 + " minutos."; } }
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"); } } } } Aquí abajo es el trozo de códigos para leer esa trama que no se donde ponerlo. char[] separadores2 = { '#', ',' };
string[] salida2 = entrada2.Split(separadores2, StringSplitOptions.RemoveEmptyEntries);
label_Resultado_valores_nonimales_de_alimentacion.Text = salida2[0] + " VA / " + salida2[1] + " W"; label_Resultado_voltaje_nominal.Text = salida2[2] + " Vac"; label_Resultado_corriente_nominal.Text = salida2[5] + " A"; label_Resultado_valores_nominales_de_frecuencia.Text = salida2[3] + " ~ " + salida2[4] + " Hz"; ¿Alguna ayuda? Gracias.
|
|
|
En línea
|
|
|
|
profinet
Desconectado
Mensajes: 31
|
He reorganizado tu código para hacerlo más modular, lo que facilitará futuras implementaciones y tareas de mantenimiento. También he introducido dos banderas para determinar qué comando se ha utilizado al enviar la solicitud, permitiendo así la llamada a la función correspondiente. using System; using System.IO.Ports; using System.Threading.Tasks; using System.Windows.Forms;
namespace Termite_SAI_04 { public partial class Form1 : Form {
private SerialPort puertoSerie; private bool verDatosFlag = false; private bool verTablaFlag = false; private readonly string verDatosReq = "B\r"; private readonly string verTablaReq = "X72\r";
private void Form1_Load(object sender, EventArgs e) { }
public Form1() { InitializeComponent(); InitSerialPort(); }
/* Iniciar y configurar el puerto serie */ private void InitSerialPort() { try { puertoSerie = new SerialPort("COM3", 2400, Parity.None, 8, StopBits.One) { Handshake = Handshake.None, ReadTimeout = 500, WriteTimeout = 500, }; // 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 de botón: Abrir puerto serie y mandar "B" */ private void Button_Ver_datos_Click(object sender, EventArgs e) { if (puertoSerie.IsOpen) { verDatosFlag = true; puertoSerie.Open(); puertoSerie.Write(verDatosReq); } else { Console.Write("Puerto cerrado. " + "No se puede solicitar datos."); } }
/* Evento de botón: Abrir puerto serie y mandar "X72" */ private void Button_Ver_Tabla_Click(object sender, EventArgs e) { if (puertoSerie.IsOpen) { verTablaFlag = true; puertoSerie.Open(); puertoSerie.Write(verTablaReq); } else { Console.Write("Puerto cerrado. " + "No se puede enviar datos."); } }
/* 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 (verDatosFlag) { ProcessVerDatosReq(str); } if (verTablaFlag) { ProcessVerTablaReq(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 VerTablaReq */ private void ProcessVerTablaReq(string str) { verTablaFlag = 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) { Invoke(new Action(() => { UpdateUIControlsVerTabla(salida); })); } else { UpdateUIControlsVerTabla(salida); } }
/* Procesar VerDatosReq */ private void ProcessVerDatosReq(string str) { verDatosFlag = false; char[] separadores = { '#', 'I', 'O', 'L', 'B', 'V', 'F', 'H', 'R', 'S' }; 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) { Invoke(new Action(() => { UpdateUIControlsVerDatos(salida); })); } else { UpdateUIControlsVerDatos(salida); } }
/* Mostrar datos VerTablaReq */ private void UpdateUIControlsVerTabla(string[] salida) { label_Resultado_valores_nonimales_de_alimentacion.Text = salida[0] + " VA / " + salida2[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] + " ~ " + salida2[4] + " Hz"; }
/* Mostrar datos VerDatosReq */ 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]);
// ¿Es igual a 1 minuto? if ((resultadoSalida7 % 60) == 1) { label_R.Text = resultadoSalida7 / 60 + " hora y " + resultadoSalida7 % 60 + " minuto."; }
// ¿Es mayor a 60 segundos o 1 minuto? if ((resultadoSalida7 % 60) > 1) { label_R.Text = resultadoSalida7 / 60 + " hora y " + resultadoSalida7 % 60 + " minutos."; }
// ¿Es igual a 60 segundos o 1 minuto? if ((resultadoSalida7 % 60) == 0) { label_R.Text = resultadoSalida7 / 60 + " hora y " + resultadoSalida7 % 60 + " minutos."; } } } }
|
|
|
En línea
|
Don't shy away from the terminal; embrace it! In the GNU world, everything is a file.
|
|
|
Meta
|
Buenas: Lo he probado y no hace nada de nada. No encuentro el motivo. Eso si, tiene variables que se llama salida2 y es solo salida en tu código, ya corregido al compilar. Compila ahora todo, no da errores pero tampoco hace nada.
|
|
|
En línea
|
|
|
|
Meta
|
Hola: He hecho una interfaz con Windows Form como indica en la captura. Se trata a la hora de recibir tramas de string o bytes por el puerto serie. Si envío el comando X72\r, me llega la tramas de Bytes y lo muestra en los labels marcado en rojo. Si envío otro comando en este caso llamado X72\r muestra los valores en otras etiquetas indicado en el recuardro en verde. Ver zoom. El problema como puedes ver en la captura, te muestra cada comando tramas diferentes en el cual quiero guardarlo en su variable para luego poder poner los valores en sus respectivos labels. Los comandos los puedes ver, sus respuestas y errores si los hay. Ver comandos PDF. Código que he hecho hasta ahora solo funciona para el recuerdre verde. using System; using System.IO.Ports; using System.Threading; using System.Windows.Forms;
namespace Termite_SAI_04 { public partial class Form1 : Form { private delegate void DelegadoAcceso(String accion); public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { try { serialPort1 = new SerialPort("COM3", 2400, Parity.None, 8, StopBits.One); serialPort1.Handshake = Handshake.None; serialPort1.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); serialPort1.ReadTimeout = 500; serialPort1.WriteTimeout = 500; serialPort1.DtrEnable = true; serialPort1.RtsEnable = true; serialPort1.Open(); ComandoB(); timer1.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (this.Enabled == true) { Thread.Sleep(500); string entrada = serialPort1.ReadExisting(); this.BeginInvoke(new DelegadoAcceso(si_DataReceived), new object[] { entrada }); //serialPort1.Write("B\r"); // Envía comando. } }
private void si_DataReceived(string accion) { try { char[] separadores = { '#', 'I', 'O', 'L', 'B', 'V', 'F', 'H', 'R', 'S', '\r' };
string[] salida = accion.Split(separadores, StringSplitOptions.RemoveEmptyEntries);
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 Mostrar 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 }
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"); } }
private void button_Ver_datos_Click_1(object sender, EventArgs e) { ComandoB(); }
private void button_Ver_Tabla_Click_1(object sender, EventArgs e) { ComandoX72(); }
// Comandos. void ComandoB() { serialPort1.Write("B\r"); }
void ComandoX72() { serialPort1.Write("X72\r"); }
private void timer1_Tick(object sender, EventArgs e) { ComandoB(); }
// Al cerrar el formulario. private void Form1_FormClosing(object sender, FormClosingEventArgs e) { timer1.Stop(); // Detiene el temporizador. Thread.Sleep(700); // 0.5 segudos. 500 milisegundos. serialPort1.Close(); // Cierra el puerto serie. } } } ¿Alguna idea? Saludos.
|
|
|
En línea
|
|
|
|
profinet
Desconectado
Mensajes: 31
|
Ah sí, tuve un descuido al copiar y pegar directamente la lógica para editar los labels. Mis disculpas por eso.
En cuanto a la afirmación de que "no hace nada", me parece extraño. Al menos debería arrojar un error al configurar el puerto o indicar "puerto cerrado" al presionar uno de los dos botones.
En tu código, sería útil almacenar el tipo de solicitud realizada ("B" o "X72") en dos variables booleanas para procesar la trama en la función correspondiente. Puedes aprovechar el mismo manejador de eventos para recibir ambos tipos de tramas y luego pasar el array de cadenas (string[]) a la función apropiada.
|
|
« Última modificación: 28 Noviembre 2023, 10:39 am por profinet »
|
En línea
|
Don't shy away from the terminal; embrace it! In the GNU world, everything is a file.
|
|
|
Meta
|
Cuando llegue a mi casa lo pruebo.
Hay algo que se me escapó y no te conté.
Todas las tramas de string o Bytes siempre empieza con # y acaba en \r.
#I230.3O230.0L007B100V25.7F50.2H50.2R0080S„€ˆ„\r
Lo comento por si acaso y los delimitadores se incluye el \r también.
|
|
|
En línea
|
|
|
|
Meta
|
Hola de nuevo. 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. 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 { puertoSerie = new SerialPort ("COM3", 2400, 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.
|
|
« Última modificación: 29 Noviembre 2023, 00:12 am por Meta »
|
En línea
|
|
|
|
Danielㅤ
Desconectado
Mensajes: 1.853
🔵🔵🔵🔵🔵🔵🔵
|
Hola, desactiva el Firewall de Windows o cualquier otro Firewall luego prueba a ejecutar ese programa exe con permisos de administrador y nos comentas las novedades.
Saludos
|
|
|
En línea
|
|
|
|
Meta
|
.
|
|
« Última modificación: 29 Noviembre 2023, 08:39 am por Meta »
|
En línea
|
|
|
|
Meta
|
Buenos días. El puertoSerie.Open(); se tiene que poner desde el principio, para que quede abierto siempre. Ahora el programa si funciona. Lo tendré que pulir después cuando salga de trabajar. Dejo el código aquí y gracias a tu ayuda ya funciona todo. A parte de esto, hay más comandos que enviar, espero que tu programa me sirva de ejemplo para que se me ejecuten todos. Dejar claro que si hay algún error, me por ejemplo, al enviar un comando que no existe me viene con este error: #-0\r Si lo has hecho bien, en algunos comando devuelve uno similar pero sin guión en medio -. #0\r Otro errores que no se cual es son. #3\r #4\r #10\r Y no recuerdo más. Son errores que ya pondré en un label. 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 { puertoSerie = new SerialPort ("COM3", 2400, Parity.None, 8, StopBits.One) { Handshake = Handshake.None, ReadTimeout = 500, WriteTimeout = 500, DtrEnable = true, RtsEnable = true, DiscardNull = false, ParityReplace = 63, ReadBufferSize = 4096, WriteBufferSize = 2018, ReceivedBytesThreshold = 1 }; // Abrir puerto serie. puertoSerie.Open(); // 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) { { UpdateUIControlsComandoX72(salida); })); } else { UpdateUIControlsComandoX72(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) { { UpdateUIControlsComandoB(salida); })); } else { UpdateUIControlsComandoB(salida); } } /* Mostrar datos verComandoX72Req */ private void UpdateUIControlsComandoX72(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 UpdateUIControlsComandoB(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."); } } } }
Una cosa muy importante. No sé si se puede corregir con estos código o hay que empezar desde cero. Para mi s muy buena idea recibir las tramas de Bytes en Bytes y no en string. ¿Es posible hacerlo? Muchísimas gracias mi muy distinguido amigo.
|
|
« Última modificación: 29 Noviembre 2023, 08:41 am por Meta »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
rs232
Electrónica
|
juanjuan19
|
3
|
3,837
|
10 Febrero 2012, 14:24 pm
por Meta
|
|
|
agregar diferentes arraylist a diferentes jlist
Java
|
manuhendrix
|
0
|
3,023
|
20 Febrero 2013, 17:09 pm
por manuhendrix
|
|
|
[pregunta]como separo diferentes threats en diferentes ventanas en windows
« 1 2 »
Programación C/C++
|
daryo
|
10
|
5,719
|
4 Octubre 2013, 23:10 pm
por daryo
|
|
|
Recibir datos a través de AJAX diferentes divs
Desarrollo Web
|
itzg3
|
4
|
2,496
|
10 Abril 2014, 22:36 pm
por itzg3
|
|
|
control rs232 via php
PHP
|
danny17
|
2
|
1,994
|
21 Mayo 2014, 14:05 pm
por danny17
|
|