Discusiones sobre Productos NI

cancelar
Mostrando los resultados de 
Buscar en lugar de 
Quiere decir: 

Problema con sincronismo al recibir bytes

Mi aplicación recibe 12 bytes por el visa read correspondientes a 6 sensores. Cada sensor son 2 bytes. Lo que me ocurre es que a veces, Labview altera el orden de llegada. Cada 2 bytes es la lectura de un sensor. El primer byte es el LSB y el segundo el MSB. luego se reconstruyen los bytes para formar un numero de 16 bits. La llegada de bytes seria asi:

 

BYTE 1     ------> 64

BYTE 2     ------>  0

 

BYTE 3     ------>  32

BYTE 4     ------>   0

 

BYTE 5     ------>   45

BYTE 6     ------>    0

 

BYTE 7     ------>    23

BYTE 8     ------>     0

 

BYTE 9     ------>    12

BYTE 10   ------>     0

 

BYTE 11   ------>    35

BYTE 12   ------>     0

 

 

lo que hace Labview a veces es esto:

 

BYTE 1     ------>  0

BYTE 2     ------>  64

 

BYTE 3     ------>   0

BYTE 4     ------>   32

 

BYTE 5     ------>   0

BYTE 6     ------>   45

 

BYTE 7     ------>    0

BYTE 8     ------>    23

 

BYTE 9     ------>    0

BYTE 10   ------>    12

 

BYTE 11   ------>    0

BYTE 12   ------>   35

 

Lógicamente si llegan así los bytes, el número que reconstruyo de 16 bits para los 6 sensores es incorrecto.

 

0 kudos
Mensaje 1 de 21
4.326 Vistas

Hola.

 

Sería conveniente que pusieses la parte de código que se ocupa de leer y ordenar y que expliques que sistema usas para sincronizar las lecturas.

 

Saludos.

Alipio.

---------------------------------------------------------
"Qod natura non dat, Salmantica non praestat"
---------------------------------------------------------
0 kudos
Mensaje 2 de 21
4.321 Vistas

adjunto parte del codigo:

 

recibo los 12 bytes en un array y cada dos corresponde a un sensor. Luego reconstruyo cada dos bytes para formar un numero de 16 bits. Labview a veces altera el orden de llegada de los bytes y el numero que forma no es el correcto.

0 kudos
Mensaje 3 de 21
4.319 Vistas

Hola.

 

Cualquier desplazamiento de un byte te produce ese error.

Cuando se envian tramas de bytes por el puesto serie, hay que asegurar que llevan un inicio de trama segun se describe en otros posts o bien usar un handshake hardware para asegurar que todo esta en su sitio.

 

Te recomiendo poner 2 bytes iniciales a FFFF para sincronizar todo.

 

Saludos.

Alipio.

---------------------------------------------------------
"Qod natura non dat, Salmantica non praestat"
---------------------------------------------------------
0 kudos
Mensaje 4 de 21
4.314 Vistas

Te refieres desde el microcontrolador enviar primero FFFF?

 

Estoy utilizando arduino para enviar los bytes de este modo

 

Serial.write(byte1MSB);

Serial.write(byte1LSB);

 

Serial.write(byte2MSB);

Serial.write(byte2LSB);

 

Serial.write(byte3MLSB);

Serial.write(byte3LSB);

 

Serial.write(byte4MSB);

Serial.write(byte4LSB);

 

Serial.write(byte5MSB);

Serial.write(byte5LSB);

 

Serial.write(byte6LSB);

Serial.write(byte6LSB);

 

La función Serial.write en arduino envia el byte que le pongas

 

0 kudos
Mensaje 5 de 21
4.310 Vistas

Exacto. 

 

Deberia enviar:

FFFF y a continuacion los 12 bytes de informacion. De es modo, lees 14 bytes y verificas que la cabecera esta en su sitio y sabes que los bytes que siguen son los correctos. Si los 2 bytes iniciales no son la cabecera, es necesario reordenar el array hasta que lo sea o bien descartar los datos hasta una nueva cabecera correcta.

 

Si puedes hacer que arduino envie la secuencia de esa manera, veremos de decodificarla adecuadamente.

 

El método que usas para decodificar los bytes es poco elegante.

 

 

Saludos.

Alipio.

 

---------------------------------------------------------
"Qod natura non dat, Salmantica non praestat"
---------------------------------------------------------
0 kudos
Mensaje 6 de 21
4.307 Vistas

qué metodo podría utilizar para decodificar mejor los bytes ?

0 kudos
Mensaje 7 de 21
4.298 Vistas

Por partes.

 

Primero estudia este enlace :

 

http://forums.ni.com/t5/Discusiones-sobre-Productos-NI/IDENTIFICAR-PRIMER-DATO-DE-LA-TRANSMISION/td-...

 

Una vez que tengas una recepcion de datos robusta, vemos como decodificarlos.

¿Qué versión de Lv tienes?

 

Saludos.

Alipio.

---------------------------------------------------------
"Qod natura non dat, Salmantica non praestat"
---------------------------------------------------------
0 kudos
Mensaje 8 de 21
4.295 Vistas

Se me olvidaba......

 

La transmision de Arduino ¿ es continua o hay un tiempo discreto entre tramas?

 

Saludos cordiales.

Alipio.

---------------------------------------------------------
"Qod natura non dat, Salmantica non praestat"
---------------------------------------------------------
0 kudos
Mensaje 9 de 21
4.286 Vistas

No, es totálmente continua. Se envian los 14 bytes de manera seguida con Serial.write(value).

 

luego le pongo un delay(10) que son 10 milisegundos, por tanto cada 10 milisegundos se envian los 14 bytes + retardo. El retardo se suma porque procesa las 6 entradas analógicas, obtiene los LSB y MSB y envia los datos.

serian algo mas de 10 milisegundos por cada loop.

0 kudos
Mensaje 10 de 21
4.285 Vistas