Spanish Recepción serie de 2 bytes imposible (SOLUCIONADO)

edochan

Member
Licensed User
Longtime User
[SOLUCIONADO]

Hola.
Soy un iniciado de los mas básico (y burro parece).
Me da bastante vergüenza preguntar esto, pero...

1- ¿Como demonios puedo recibir 2 bytes seguidos correctamente?

Tengo un dispositivo enviándome 2 bytes cada 10milisegundos .
Si simplemente leo 1 a 1 los bytes que entran, perfecto, salen en un label correctamente, pero si lo intento esperando un segundo byte, ya no va bien, captura cada 10 segundos (o más), una combinación de esas (2 bytes).
Es como si el buffer se atascara.

2- No se puede limpiar el buffer con un clear o algo así?
Lo intente con la librería SLByteArrayBuffer, pero no me funciona.

¿Me podríais echar una mano por favor?, ya he leído 200 post sobre la recepción y captura del puerto serie, y no doy con ello, debo ser el mas torpe del foro con diferencia.

Lo intento así:

Sub AStreams_NewData (Buffer() As Byte) 'se recibió un dato

If Buffer.Length > 1 Then
clave = Buffer(0) ' se extrae la clave del primer byte
If Buffer (0) > 0 AND Buffer (0) < 12 Then ' si esta dentro de este valor
valor = Buffer(1) ' y el valor del segundo
If valor < 0 Then valor = 256 - Abs(valor)
End If
Bufer.Text = Buffer.length
enBuffer.Text = Buffer(0) & ": " & Buffer(1)
txtLog.Text = clave
valorText.Text = valor

verText.Text = verText.Text & clave & " : " & valor & " "
Buffer.clear

End If

End Sub

* aunque quite esta linea no mejora >> If Buffer (0) > 0 AND Buffer (0) < 12 Then

3- Por cierto, ¿como puedo conseguir leer bytes Unsigned?
¿no hay un método de recepción directo?
Vamos, que si le envian un byte en ASCII = 200, lea 200 y no -124 ( o lo que sea)

Perdonad mis formas, estoy ya bastante cansado y no lo consigo.

Saludos.
 
Last edited:

edochan

Member
Licensed User
Longtime User
* La linea del Buffer.clear no va, lo copie cuando lo estaba probando, pero me dio error y lo borre, perdón.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola edochan

No te preocupes por no entender cosas, ninguno nacimos sabiendo.

Antes de nada, cuando pongas código, hazlo dentro de la ventana que se abre al pulsar el quinto icono por la derecha, asi se entenderá mejor.

En el buffer te va llegando los bytes que le llegan al dispositivo, asi que lo interesante es que los captures y los trates, y si esperas dos y viene uno, tendras que emplear una variable global e ir metiendolos ahi y luego tratarlos.
Por otro lado, en el codigo que has puesto cuando te llegue un byte lo perderas, ya que solo lo tratas cuando la longitud es >1, (If Buffer.Length > 1 Then )

Saludos
 

edochan

Member
Licensed User
Longtime User
Efectivamente, lo he cambiado y ya recibo mejor.
(Te he contestado por correo, y será mejor ponerlo aquí.)
Cuando se borra el buffer?
Se puede borrar manualmente con alguna sentencia? Por si desborda.
Muchas gracias por la respuesta, un saludo.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

No he recibido ningun correo, no se a donde lo has enviado.

No tienes que borrar el buffer, AsyncStreams no pone en cola los mensajes entrantes. Siempre que hay un mensaje completo (modo de prefijo) se provoca el evento NewData.

Seria interesante que en la cabecera del post pongas [SOLUCIONADO], asi es mas facil para los que buscan algo saber si se resolvió sin entrar en el post, de esa forma es mas ágil la búsqueda.


saludos
 

edochan

Member
Licensed User
Longtime User
Hola.
Pues tienes razón, a pesar de que en el mensaje que me llegó, ponía Not reply lo conteste. Pero bueno, más o menos te comentaba lo mismo.

Disculpa mi mar de dudas, que creo que se disiparía sabiendo 4 cosas:
...Si se produce otro evento de newdata,
- ¿el valor recibido donde lo carga, usa el mismo registro y borra lo que hubiera anteriormente? ( o sea, no es un buffer acumulativo)
Sabes de cuantos bytes es, o hay riesgo de que se sature y cuelgue el programa?
Cuando hice uno con App inventor, si que tenía un buffer que iba guardando secuencialmente lo que entraba, así lo iba leyendo se limpiaba solo. (Creo que funcionaba así).

Espero haberme explicado y no quitarte demasiado tiempo. Muchas gracias.

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Que contesto a tus dudas:

...Si se produce otro evento de newdata,
- ¿el valor recibido donde lo carga, usa el mismo registro y borra lo que hubiera anteriormente? ( o sea, no es un buffer acumulativo)
Lo carga en Buffer(), asi que lo que no guardes lo pierdes.

Sabes de cuantos bytes es, o hay riesgo de que se sature y cuelgue el programa?
Dudo que se sature, ya que conforme existe un evento Buffer() vuelve a coger el valor actual

Saludos
 

edochan

Member
Licensed User
Longtime User
Entonces si no he comprendido mal, solo tiene el registro buffer() para almacenar un valor por evento.
No se pueden recibir 2 bytes a la vez. Para eso es preciso capturarlos en una variable y posteriormente tratarlos.
Si es así de simple, creo que ya esta comprendido.
Muchas gracias.
Un saludo.
 

edochan

Member
Licensed User
Longtime User
¿Abro otro post aparte para preguntar sobre como recibir valores de byte unsigned (0 - 255) directamente?
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola, lo de [solucionado] tienes que cambiar el titulo del post para que cuando estes en el foro ademas del titulo, al final salga [solucionado] , de esa forma sin entrar en el post se verá.

Cuando la pregunta es diferente a la inicial, mejor abrir nuevos post, de esa forma te podran contestar, si preguntas diferente, a menos que se entre en el post nadie lo sabra.

Felices vacaciones a todos. Nos vemos en Septiembre ;)

Saludos
 
Top