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.