Spanish Seleccionar datos de una trama

DAOT

Member
Licensed User
Hola estoy atorado en una parte y no sé cómo podría ser si alguien me puede orientar es sobre lo siguiente:

En el Label1 puedo ver las secuencias de tramas que llega en código ASCII y en el Label2 convertida en hexadecimal encuentro que es más fácil trabajar así.

Sub Astreams_NewData (Buffer() AsByte)

Log("NewData")

Label1.Text= label1.Text & BytesToString(Buffer, 0, Buffer.Length, "UTF8")

Label2.Text = Label2.Text & conv.HexFromBytes(Buffer)

EndSub

Las tramas que recibo son:

347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF34….. Sucesivamente ajja

Se repite la trama principal que lee cada cierto tiempo. 7E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF34

Mis consultas son:

1- Debiera empezar la primera trama con 7E… pero me aparece el 34 en el comienzo. Que puedo hacer para que me cuente desde el 7E.. en adelante

2- Lo otro es que en un label debo visualizar de la trama la posición 43 a la 46 que serían 03FF. Como se Podría hacer y cuando aparezca la nueva trama que sigue esos valores se actualicen y así cada vez que aparezca una nueva.

Gracias de antemano
 

Heppy

Active Member
Licensed User
Longtime User
Hola.

Mi solución es utilizar IndexOf para saber donde está la cabecera del mensaje que es 34 y luego ir analizando la string por partes.

Luego sabiendo la posición de los datos, puedes presentarlos con substring2.

Ejemplo
B4X:
Sub Button1_click
    Dim s, analizar As String
    Dim i As Int
    s="347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF347E001A920013A2004066CEF8FFFE010100001F03FF03FF03FF03FF03FF"
    i=s.IndexOf("34")
    Log(i)
    Do While i>-1
        s=s.SubString(i+2)
         i=s.IndexOf("34")
        If i>-1 Then
          analizar=s.SubString2(0,i-1)
        Else
          analizar=s
        End If       
        Log(analizar)
    Loop
End Sub

Para presentar los datos Label1.Text=analizar.substring2(43,46) o los valores que quieras
Espero te sirva
 

DAOT

Member
Licensed User
Hola compa gracias por la ayuda he estado probando lo que me sugeriste y tengo una sola duda si en la variable s que es donde colocaste mis datos fuera variable que cambiara cada cierto tiempo los datos y el largo como se podría colocar he probado algunas cosas, pero me sale un error jaja

Disculpa las molestias, pero no me manejo mucho jaja
 

Heppy

Active Member
Licensed User
Longtime User
Bueno, la solución es simple. Sabes la longitud de la cadena, por lo que debe ser siempre como minimo de x bytes.
Declaras una variable global Dim BufferRec as String

Sub Astreams_NewData (Buffer() AsByte)

BufferRec=BufferRec& BytesToString(Buffer, 0, Buffer.Length, "UTF8")
If BufferRec.Length>=Longitud minima mensaje then
Analiza

Y por supuesto para eso estamos, para ayudarnos en lo posible.
 
Last edited:

DAOT

Member
Licensed User
Hola compa he probado lo que me dijiste, pero no me resulto o no supe hacerlo ajaj

Con respecto al código que me escribiste :

Label1.Text=analizar.substring2(43,46)

Puedo ver en el Label los datos de esas posiciones, pero no sé cómo podría crear una rutina donde cada cierta posición de números los muestre en el mismo label como por ejemplo yo quiero la posición 43 a la 46 y luego me visualice en la posición 103 a la 106 ósea que cada 60 posición tome el ese valor, no sé cómo dejar en un siclo infinito ya que los datos llegan sin detenerse.

Y gracias
 

DAOT

Member
Licensed User
Hola compa, volví a retomar el tema después de tanto tiempo he tenido algunas complicaciones de tiempo ajjaj

Probé lo que me enviaste y saque una idea y me resulto. Coloque un timer y dentro unos cuantos if y me arrojan lo que necesito de mi variable en las posiciones futuras.

Solo tenía el problema que me cerraba la aplicación so SubString cuando no había dato en la posición, pero me dijeron que coloque un Try-Catch y funciono. Ahora estoy con otros detalles a ver si me las puedo solo ajja.

Gracias por la ayuda.
 
Top