Autor Tema: ¿Cómo mostrar tramas de Bytes separados en cada textBox?  (Leído 1838 veces)

Meta

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
¿Cómo están compañeros del foro?

Se trata de que uso un terminal llamado Termite gratuito que lee el puerto serie, envío una letra B mayúscula y seguido envía también el \r.



La configuración es esta:


Como dije arriba, con Termite he enviado el comando B. Su respuesta es esta:

#I225.7O226.2L006B100V25.7F50.2H50.2R0080S€„€ˆ„À

A partir de la página 4 indica el comando a enviar que es el B y luego explica todo lo que recibe después.

Ver documento PDF.

En el programa Termite al enviar el comando B, recibe toda una trama de Bytes en el cual quiero ponerlo por separado en  Windows Form 4.7.2 .net o superior con Visual Studio Community 2022 gratuito.

En la versión que tengo, no se usa la C, T ni la Q. De todas formas al recibir las tramas de Bytes lo vas a ver.

Leer la S de forma independiente lo veo complicado, lo dejaré más adelante hasta cuando consiga lo más sencillos.

Quiero saber la forma más directa que al recibir la trama de Bytes, al menos me centro en vez de esto con la S:
#I226.6O226.6L006B100V25.7F50.2H50.2R0120S€„€ˆ„À

Me centro sin la S con esto indicado abajo:
#I226.6O226.6L006B100V25.7F50.2H50.2R0120

Me imagino que todo esto se almacenará en una variable tipo string, luego habrá que separarlo por cada textBox que se muestre.

Ejemplo con Windows Form.


¿Algún ejemplo de cómo separar la trama de Bytes y mostrarlo de forma independiente en el Windows Form en código C#?

Muchas gracias por leer hasta aquí.
« Última modificación: 28 de Octubre 2023, 21:19 por Meta »

Meta

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re: ¿Cómo mostrar tramas de Bytes separados en cada textBox?
« Respuesta #1 en: 29 de Octubre 2023, 08:34 »
En modo consola funciona muy bien usando separadores e incluso expresiones regulares.

Separadores o delimitadores:
Código: [Seleccionar]
            string entrada = "#I225.7O226.2L006B100V25.7F50.2H50.2R0080S€„€ˆ„À\r\n\r\n";

            char[] separadores = { '#', 'I', 'O', 'L', 'B', 'V', 'F', 'H', 'R', 'S' };

            var salida = entrada.Split(separadores, StringSplitOptions.RemoveEmptyEntries);

            Console.WriteLine(@"Entrada:
" + entrada +
"Salida:");

            foreach (var c in salida)
            {
                Console.WriteLine(c);
            }

Expresión regular:
Código: [Seleccionar]
            Regex rx = new Regex(@"#I(.*)O(.*)L(.*)B(.*)V(.*)F(.*)H(.*)R(.*)S(.*)",
                RegexOptions.Compiled | RegexOptions.IgnoreCase);

            string texto = "#I225.7O226.2L006B100V25.7F50.2H50.2R0080S€„€ˆ„À";

            MatchCollection partidos = rx.Matches(texto);

            foreach (Match match in partidos)
            {
                foreach (Group grupo_ in match.Groups)
                {
                    Console.WriteLine(grupo_.Value);
                }
            }

El problema está que uso Windows Form y cada separación tiene que estar en su textBox. Esto ya es más complicado.

Cada nombre indicado aquí abajo de su textBox para cada letra y meter sus valores ahí.


Saludos.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 990
    • Ver Perfil
Re: ¿Cómo mostrar tramas de Bytes separados en cada textBox?
« Respuesta #2 en: 29 de Octubre 2023, 11:11 »
Yo soy más de Java y no puedo darte un código C# concreto para solucionarlo.
Pero la lógica que yo intentaría seguir (independientemente del lenguaje) sería crear un array con esos textbox.

Entonces, aquí, en lugar de recorrer el array salida y escribir los datos en consola
Código: [Seleccionar]
foreach (var c in salida)
{
        Console.WriteLine(c);
}

Lo que haría será pasar esos datos a los textbox del array.

Podría ser algo como esto, aunque puede que haya algún error de sintaxis.
Ya te digo que en C# estoy muy verde.... :P

Código: [Seleccionar]
//Construcción de una lista de boxes
List<TextBox> listaDeBoxes = new List<TextBox>();
listaDeBoxes.Add(textBox_I);
listaDeBoxes.Add(textBox_O);
listaDeBoxes.Add(textBox_L);
listaDeBoxes.Add(textBox_B);
listaDeBoxes.Add(textBox_V);
listaDeBoxes.Add(textBox_F);
listaDeBoxes.Add(textBox_H);
listaDeBoxes.Add(textBox_R);
//Indice para recorrer cada elemento de la lista
int i = 0;

foreach (var c in salida)
{
        listaDeBoxes[i].Text = c; //Asignamos valor al textBox
        i++; //Incrementamos indice para pasar al siguiente textBox
}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Meta

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re: ¿Cómo mostrar tramas de Bytes separados en cada textBox?
« Respuesta #3 en: 29 de Octubre 2023, 21:27 »
Muchas gracias.

Me ha dado ideas y ahora si funciona.

Código: [Seleccionar]
using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace Termite_SAI_01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button_Enviar_Click(object sender, EventArgs e)
        {
            string expresionRegular = @"#I(.*)O(.*)L(.*)B(.*)V(.*)F(.*)H(.*)R(.*)S(.*)";
            Regex rx = new Regex(expresionRegular,
                   RegexOptions.Compiled | RegexOptions.IgnoreCase);

            string texto = "#I225.7O226.2L006B100V25.7F50.2H50.2R0080S€„€ˆ„À";

            MatchCollection matches = rx.Matches(texto);
            textBox_I.Text = matches[0].Groups[1].Value;
            textBox_O.Text = matches[0].Groups[2].Value;
            textBox_L.Text = matches[0].Groups[3].Value;
            textBox_B.Text = matches[0].Groups[4].Value;
            textBox_V.Text = matches[0].Groups[5].Value;
            textBox_F.Text = matches[0].Groups[6].Value;
            textBox_H.Text = matches[0].Groups[7].Value;
            textBox_R.Text = matches[0].Groups[8].Value;
            //textBox_S.Text = matches[0].Groups[9].Value;

            MessageBox.Show("Ya se procesó la cadena");
        }
    }
}

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".