ni.com checkout is currently experiencing issues.

Support teams are actively working on the resolution.

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.318 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.313 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.311 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.306 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.302 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.299 Vistas

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

0 kudos
Mensaje 7 de 21
4.290 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.287 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.278 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.277 Vistas