Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Tengo un problema con delimitadores (https://www.clubdelphi.com/foros/showthread.php?t=96504)

REHome 30-11-2023 07:05:09

Tengo un problema con delimitadores
 
Hola:

En una variable tipo string[] tengo esto usando el lenguaje C# en decimal.
Código:

#I225.7O226.2L006B100V25.7F50.2H50.2R0080S€„€ˆ„\r
En otra variable string[] tengo lo mismo pero los datos en decimales.
Código:

string entrada2 = "35 73 50 51 53 46 51 79 50 51 53 46 55 76 48 48 54 66 49 48 48 86 50 54 46 48 70 53 48 46 50 72 53 48 46 50 82 48 48 56 48 83 144 132 128 136 132 192 13";
Si te fijas bien en el primer delimitador a partir de la S son bits, la trama comparte entre string y nivel a bits, es decir, usa distinto tipos de datos.

La S muestra esto.
S€„€ˆ„\r

Siempre estas cadenas empieza con # y acaba con \r. No se si hace falta usar StartsWith y EndsWith.

Tabla ASCII.


Fijándose en la tabla ASCII la S rn decimal es 83. A partir de ahí en la cadena entrada2 tiene 144 132 128 136 132 192 y el final que es retorno de carro es el 13 en decimal.

Ya que se lee bien los string de esta linea I225.7O226.2L006B100V25.7F50.2H50.2R0080S y después de la S me da disparates como esto: S€„€ˆ„\r, mejor pasarlo a decimal que es esto otro 144 132 128 136 132 192.

El resultado si ejecuto el código completo es este:


La idea es que muestre bien los datos completo al recibirlos, no en en tipo string y entre medio bit, es decir, datos de distintos tipos.

Parece ser que debo capturar o coger estos datos:
I225.7O226.2L006B100V25.7F50.2H50.2R0080

Separarlos y mostralo así:
225.7
226.2
006
100
25.7
50.2
50.2
0080
€„€ˆ„

Como se puede ver, se muestra esto de la S.
€„€ˆ„

Es ilegible, debería mostrarse así y separados al menos en decimal que se entiende mejor como muestra justo abajo.
144
132
128
136
132
192

¿Existe alguna forma posible que muestre bien la trama completa?

Dejo el código de ejemplo en Visual C#:
Código:

namespace Probando_tramas_para_el_SAI_UPS_01___.NET_6._0
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Text = "Probando tramas de bytes";
        }

        private void button_Ver_Click(object sender, EventArgs e)
        {
            // Tramas de bytes con diferentes tipos de datos. A partir de la S, son bits.
            // Siempre la trama empieza con # y acaba con retorno de carro \r. <cr>.
            string entrada = "#I225.7O226.2L006B100V25.7F50.2H50.2R0080S€„€ˆ„\r";
            string entrada2 = "35 73 50 51 53 46 51 79 50 51 53 46 55 76 48 48 54 66 49 48 48 86 50 54 46 48 70 53 48 46 50 72 53 48 46 50 82 48 48 56 48 83 144 132 128 136 132 192 13";

            // Delimitador para separar tramas.
            char[] separadores = { '#', 'I', 'O', 'L', 'B', 'V', 'F', 'H', 'R', 'S', '\r' };

            // Cortar tramas y lo alacemna en una variable array tipo string.
            string[] salida = entrada.Split(separadores);

            foreach (string item in salida)
            {
                richTextBox1.Text += item;
                richTextBox1.Text += Environment.NewLine;
            }

            // Nueva línea.
            richTextBox1.Text += Environment.NewLine;
            richTextBox1.Text += Environment.NewLine;

            // --------------

            string[] salida2 = entrada2.Split(separadores);

            foreach (string item2 in salida2)
            {
                richTextBox1.Text += item2;
            }
        }
    }
}

Un cordial saludos.

Saludos.

tsk 30-11-2023 18:13:53

Porque no conviertes a bytes el string,

Por ejemplo

Código PHP:

using System;

public class 
Str2Byte
{
    public static 
void Main()
    {
        
string text "€„€ˆ„";

        foreach( 
char c in text)
        {
            
Console.WriteLine(c);
            
byte b = (byte)c;
            
Console.WriteLine(b);
        }

    }


Código:

./str2byte.exe

172

30

172
ˆ
198

30


REHome 02-12-2023 11:44:19

Buenas.

Funciona tu código. Me di cuenta que esos caracteres no hay que hacerles caso, debo recoger los datos tal cual como vienen en el puerto serie. Por ejemplo he hecho el de string, hexadecimal y binario como puedes ver aquí abajo.

Cita:

#I223.4O223.6L007B100V26.0F50.2H50.2R0080S??????

23493232332E344F3232332E364C303037423130305632362E304635302E324835302E325230303830533F3F3F3F3F3F0D

1000111001001110010110010110011101110110100100111111001011001011001110111011011010011001100001100001 1011110000101100011100001100001010110110010110110101110110000100011011010111000010111011001010010001 1010111000010111011001010100101100001100001110001100001010011111111111111111111111111111111111111110 1
La idea es tal cual como incida en la imagen de abajo.


Marqué en rojo en la captura de arriba exactamente los seis bytes que quiero, luego tengo que guardarlos ya en un array, matriz o como quiera para luego mostrar en su label correspondiente el resultado.

Código que he hecho con string, hexadecimal y binario con Windows Form.
Código:

private void Actualizar(object sender, EventArgs e)
{

    // Asignar el valor de la trama al richTextBox.
    richTextBox1.Text += recibidos;
    // Nueva línea.
    richTextBox1.Text += Environment.NewLine;

    // Pasar a hexadecimal.
    //foreach (byte item in recibidos)
    foreach (byte item in recibidos.Select(v => (byte)v))
    {
        // x = minúscula, X = mayúscula.
        richTextBox1.Text += item.ToString("X2");
    }

    // Nueva línea.
    richTextBox1.Text += Environment.NewLine;
    richTextBox1.Text += Environment.NewLine;

    // Pasar a binario.
    foreach (string leer in recibidos.Select(c => Convert.ToString(c, 2)))
    {
        richTextBox1.Text += leer.ToString();
    }

    // Nueva línea.
    richTextBox1.Text += Environment.NewLine;
    richTextBox1.Text += Environment.NewLine;

    // Selecciona la posición final para leer los mensajes entrantes.
    richTextBox1.SelectionStart = richTextBox1.Text.Length;

    // Mantiene el scroll en la entrada de cada mensaje.
    richTextBox1.ScrollToCaret();

    // Limpiar.
    recibidos = "";
}

No me sale tal como indica en el Real Term de la primera imagen.

Espero que así de entrada no tenga que trabajar usando codificaciones ni nada. Han hecho el error para mi, trabajar con distintos tipos de datos en una misma trama.

¿Se puede hacer lo que quiero?

Saludos.

tsk 03-12-2023 04:32:02

Ya veo cual es tu problema, pero si seleccionas la codificación adecuada, no deberías tener problemas con manejar los dos casos al mismo tiempo.

Código PHP:

using System;
using System.IO.Ports;
using System.Text;

public class 
TSer
{
    static 
SerialPort _serialPort;

    public static 
void Main()
    {
        
char[] c= {'a','b'};
        
        
_serialPort = new SerialPort("/dev/ttyACM0",115200Parity.None8StopBits.One);
        
_serialPort.Handshake Handshake.None;
        
_serialPort.Encoding Encoding.GetEncoding(28591);  //Aquí estoy seleccionando la codificación

        
_serialPort.WriteTimeout 500;
        
_serialPort.ReadTimeout 500;
        
_serialPort.Open();
        
_serialPort.Write(c,0,1);
        var 
readData _serialPort.ReadLine();
        
Console.WriteLine(readData);
        foreach(
char d in readData)
        {
            
byte b = (byte)d;
            
Console.WriteLine(b);
        }
    }



Código:

$ ./tser.exe
S

 À
83
144
132
128
136
132
192


REHome 05-12-2023 01:33:56

Me dice: El índice esta fuera de los límites de la matriz.


Ver imagen.

Al menos en la matriz internamente parece que funciona.

REHome 05-12-2023 02:01:51

Funciona.

Código:

            uint[] numeros = new uint[6];
            uint contador = 0;

            foreach (uint elemento in salida[8])
            {
                //richTextBox1.Text += b.ToString();
                richTextBox1.Text += Environment.NewLine; // Nueva línea.
                richTextBox1.Text += $"Array: {numeros[contador] = elemento}";
                ++contador;
            }

Muchísimas gracias.


La franja horaria es GMT +2. Ahora son las 01:57:22.

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