Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   ¿Cómo interpretar los datos recibidos? (https://www.clubdelphi.com/foros/showthread.php?t=96462)

REHome 28-10-2023 12:45:22

¿Cómo interpretar los datos recibidos?
 
¿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í.

Casimiro Notevi 28-10-2023 19:13:54

¿Entonces los valores siempre son numéricos y los separadores son siempre letras?

tsk 28-10-2023 21:31:24

Podrías usar expresiones regulares, como por ejemplo

Código PHP:

using System;
using System.Text.RegularExpressions;

public class 
RegularEx
{
    public static 
void Main()
    {
        
Regex rx = new Regex(@"#I(.*)O(.*)L(.*)B(.*)V(.*)F(.*)H(.*)R(.*)S(.*)",
                
RegexOptions.Compiled RegexOptions.IgnoreCase);

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

        
MatchCollection matches rx.Matches(text);

        foreach(
Match match in matches)
        {
            foreach( 
Group group_ in match.Groups)
            {
                
Console.WriteLine(group_.Value);
            }
        }
            
    }


Salida

Código:

$ ./RegularEx.exe
#I225.7O226.2L006B100V25.7F50.2H50.2R0080S€„€ˆ„À
225.7
226.2
006
100
25.7
50.2
50.2
0080
€„€ˆ„À


REHome 29-10-2023 08:10:13

Cita:

Empezado por Casimiro Notevi (Mensaje 553084)
¿Entonces los valores siempre son numéricos y los separadores son siempre letras?


Las letras siempre serán letras. La última que es la S, es fija, después de la S, lo que cambia internamente son bits en un Byte, puede haber más letras al final pero esto ya es otra historia.

Lo que cambia es son los números después de cada letra, que so valores junto con su punto que es la coma de dicho valor, por ejemplo: 227.7 de la letra I.

@tsk:
Funciona tu código en modo consola mostrando los datos en pantalla.

Ahora es probarlo en Windows Form, ya que cada textBox tiene su nombre. Aquí ya la cosa se complica.




Muchas gracias por la ayuda mi muy distinguidos amigos.

tsk 29-10-2023 20:24:23

En que sentido se complica

Código PHP:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Text.RegularExpressions;

public class 
Ventana Form
{
    private 
Button b;
    private 
TextBox txtBox_I;
    private 
TextBox txtBox_O;
    private 
TextBox txtBox_L;
    private 
TextBox txtBox_B;
    private 
TextBox txtBox_V;
    private 
TextBox txtBox_F;
    private 
TextBox txtBox_H;
    private 
TextBox txtBox_R;
    private 
TextBox txtBox_S;
    
    static public 
void Main()
    {
        
Application.Run(new Ventana());
    }

    private 
Ventana()
    {
        
= new Button();
        
b.Text "Click Me!";
        
b.Click += new EventHandler (Button_Click);
        
Controls.Add(b);

        
txtBox_I = new TextBox();
        
txtBox_I.Text "";
        
txtBox_I.Location = new Point(10,20);
        
Controls.Add(txtBox_I);

        
txtBox_O = new TextBox();
        
txtBox_O.Text "";
        
txtBox_O.Location = new Point(10,40);
        
Controls.Add(txtBox_O);
        
        
txtBox_L = new TextBox();
        
txtBox_L.Text "";
        
txtBox_L.Location = new Point(10,60);
        
Controls.Add(txtBox_L);

        
txtBox_B = new TextBox();
        
txtBox_B.Text "";
        
txtBox_B.Location = new Point(10,80);
        
Controls.Add(txtBox_B);

        
txtBox_V = new TextBox();
        
txtBox_V.Text "";
        
txtBox_V.Location = new Point(10,100);
        
Controls.Add(txtBox_V);

        
txtBox_F = new TextBox();
        
txtBox_F.Text "";
        
txtBox_F.Location = new Point(10,120);
        
Controls.Add(txtBox_F);

        
txtBox_H = new TextBox();
        
txtBox_H.Text "";
        
txtBox_H.Location = new Point(10,140);
        
Controls.Add(txtBox_H);

        
txtBox_R = new TextBox();
        
txtBox_R.Text "";
        
txtBox_R.Location = new Point(10,160);
        
Controls.Add(txtBox_R);

        
txtBox_S = new TextBox();
        
txtBox_S.Text "";
        
txtBox_S.Location = new Point(10,180);
        
Controls.Add(txtBox_S);
    }

    private 
void Button_Click(object senderEventArgs e)
    {
        
string pattern1 = @"#I(.*)O(.*)L(.*)B(.*)V(.*)F(.*)H(.*)R(.*)S(.*)";
         
Regex rx = new Regex(pattern1,
                
RegexOptions.Compiled RegexOptions.IgnoreCase);

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

        
MatchCollection matches rx.Matches(text);
        
txtBox_I.Text matches[0].Groups[1].Value;
        
txtBox_O.Text matches[0].Groups[2].Value;
        
txtBox_L.Text matches[0].Groups[3].Value;
        
txtBox_B.Text matches[0].Groups[4].Value;
        
txtBox_V.Text matches[0].Groups[5].Value;
        
txtBox_F.Text matches[0].Groups[6].Value;
        
txtBox_H.Text matches[0].Groups[7].Value;
        
txtBox_R.Text matches[0].Groups[8].Value;
        
txtBox_S.Text matches[0].Groups[9].Value;
        
        
MessageBox.Show("Ya se procesó la cadena");
    }



REHome 29-10-2023 21:21:43

Me funciona de maravilla.

Código:

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");
        }
    }
}

Muchas gracias mi muy distinguido amigo. ;)


La franja horaria es GMT +2. Ahora son las 20:21:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi