Discusiones sobre Productos NI

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

Problema al recibir float desde microcontrolador

Hola:

 

intento graficar la señal de un microcontrolador que envia cada 250 milisegundos un dato por rs232, por tanto son 4 datos por segundo. He configurado la vi para recibirlo pero no grafica correctamente.

 

existe algun modo de que labview esté continuamente chequeando el puerto serie y que solo reciba el float cuando esté disponible ?. Desde el microcontrolador los float los manda en 32 bits, es decir, 4 bytes.

 

saludos

 

aitor

0 kudos
Mensaje 1 de 14
3.653 Vistas

Hola aitorsp, si lo puedes controlar, si te fijas en tu programa tienes un nodo que revisa cuantos bytes hay en el puerto y después al vi de leer el puerto le estás diciendo que lea esa cantidad de datos.

Hay dos opciones que tienes aquí, una es configurar tu segundo VI a que siempre lea 4 bytes, la única desventaja de esto es que se va a quedar esperando a recibirlos hasta que tenga todos los datos o se de un timeout de puerto por lo que puede parecer que se trabo tu programa, si el flujo de datos de tu procesador es continuo puedes tomar esta opción.

La segunda opción es utilizar la salida de nodo de propiedad y usar un comparador para ver cuando ya están todos los datos, si están todos los datos lees el puerto si no están dejas no haces nada.

Saludos

Benjamin C
Principal Systems Engineer // CLA // CLED
0 kudos
Mensaje 2 de 14
3.612 Vistas

Hola:

 

Muchas gracias. Podrias poner un pequeño ejemplo de lo ultimo que has comentado?.

Puedes modificar mi Vi sin problema.

0 kudos
Mensaje 3 de 14
3.610 Vistas

En el caso de tu VI la primer opcion aplica solo poner el numero de bytes, ya que viendo el resto de tu VI no haces nada a menos que recibas infomacion, de cualquier forma para que veas la segudna opcion aqui esta.

ByteControl.PNG

 

Saludos

Benjamin C
Principal Systems Engineer // CLA // CLED
0 kudos
Mensaje 4 de 14
3.608 Vistas

Hola:

 

parece que funciona mas o menos aunque comento algunas cosas. me he dado cuenta testeando el numero de bytes que llegan a labview que dependiendo del float que envie necesito ponerle mas de 4 al count. por ejemplo enviando el float 3.78 recepciona labview correctamente si le pongo 5. si el float es 123.34 necesito ponerle 6 y si son numeros negativos por ejemplo -123.45 recepciona bien poniendole 7.

 

no hay forma de que labview detecte el float independientemente del valor que yo le ponga a count?

0 kudos
Mensaje 5 de 14
3.603 Vistas

 Hola Aitorsp, aquí tiene que ver con como estas enviando la información desde tu micro controlador. Si tu estas usando el programa puedes especificar la forma en la que estas enviando los datos, hay 3 formas en que puedes enviar el dato:

  •    Armar un frame con un tamaño fijo y siempre leer los bloques de este tamaño.
  •    Generar un metaframe, en el cual por ejemplo los primeros 2 bytes (dependiendo del tamaño que puede tomar tu dato) especifiquen el tamaño del resto del dato, en este caso primero siempre les el tamaño y después lees el numero de bytes que se te indico.
  •    Enviar al final un caracter de terminación para reconocer el fin de tu mensaje.

 Si no tienes control en los datos que se están enviando, lo que tienes que hacer es tomar todos los datos e irlos procesando en forma manual para ver cuando  La otra opción es que siempre tomes todos los bytes y los armes dentro de LabVIEW para ver que completan un dato, pero esto lo tienes que hacer en forma manual con manipulación de strings, y ya una vez que este completo actualizas tus indicadores.

Saludo

s

Benjamin C
Principal Systems Engineer // CLA // CLED
0 kudos
Mensaje 6 de 14
3.597 Vistas

Ok, entonces si envio por ejemplo el  ' \r ' despues de cada float desde el microcontrolador como lo puedo detectar en labview?. Seria con un case y detectando si llega el codigo ASCII de \r  ?

0 kudos
Mensaje 7 de 14
3.595 Vistas

Hola aitorsp aquí hay un pequeño tutorial para eso:

Termination Characters in NI-VISA

How Can I Configure the Termination Character for VISA Serial Reads?

También en el ejemplo en Help >> Find examples >> que se llama Advance Serial Write and Read puedes ver como se usa.

Saludos

Benjamin C
Principal Systems Engineer // CLA // CLED
0 kudos
Mensaje 8 de 14
3.590 Vistas

he probado el ejemplo Advanced serial read write y efectivamente me llega bien el float junto con el CR \r pero me obliga a poner el count en la funcion Visa read por lo que cuando los numeros float son mayores vuelve a dar problemas al recibir, es decir, no encuentro el modo de que detecte automaticamente el float que le mando desde el microcontrolador.

 

Probare quizas a enviar en vez de un float, un numero entero desde el microcontrolador y luego desde labview le aplico la conversion a float.

0 kudos
Mensaje 9 de 14
3.585 Vistas

Hola,

 

       En binario un float son 4 bytes y siempre lo serán, el problema es que estas enviando desde el microcontrolador es el equivalento en caracteres de texto ASCII del número, donde cada caracter es representado por 1 byte y dependiendo del tamaño del número te variara la cantidad de bytes que necesites. Lo que deberias de tratar es desde tu microcontrolador tomar tu float de 32bits, sacarle los 4 bytes en formato bianrio y enviarlo.

 

Saludos Cordiales,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
Mensaje 10 de 14
3.576 Vistas