Discusiones sobre Productos NI

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

Problemas con el guardado de datos desde labview. Help!!

¡Resuelto!
Ir a solución

Buenos días. Agradecería enormemente vuestara ayuda, pues llevo muchísimo tiempo atascado en una cuestión que no se resolver, he probado practicamente todo y no consigo guardar datos en un archivo. Me da igual que sea excel, txt, etc., lo que quiero es que se guarden los datos ordenadamente . Por lo general, todas las opciones que he probado que acaban guardando un montón de filas vacías sin datos...estoy que me tiro de los pelos ya...

 

La cuestión es la siguiente, leo unos datos que recibo por puerto serie de arduino, tal y como os adjunto en la foto.

SerialArduino.jpg

 

 

Como veis, he introducido en mi código unos caractéres P y A que me indican principio y final de cadena, para después tratar los datos en labview (estos datos los recibo sólo por una entrada del arduino, a través de un multiplexor 8 canales).

 

 

Y lo que recibo es lo que adjunto en el archivo de texto "Canal_0.txt". Logicamente, no es manera de presentar unos datos, no se si depende de la configuración o formato de la función "Write Delimited Spreadsheet" o de cualquier otra cosa.

 

Agradecería si me ayudaran.

Muchísimas gracias y saludos.

 

PD.: Adjunto archivo de texto y VI.

 

 

 

 

 

 

 

 

 

 

 

 

Descargar todos
0 kudos
Mensaje 1 de 32
5.374 Vistas

Hola BrejBoriv:

Revisando tu código observo una serie de cuestiones que debes considerar:

- La escritura en el fichero debe de estar dentro del Case, para que no escriba líneas de datos vacíos con la fecha al final.

- Por otra parte, plantéate el caso de que no lleguen datos al puerto (ni P ni A). Debes poner otro Case para que solamente escriba en el fichero si ha llegado datos ( P .... A).

- No consideras los datos que llegan por el puerto después después de P, A y fin de línea. Lo suyo es que esos datos los vuelvas a tratar (buscando P, A y fin de línea) hasta que no queden datos por tratar que tendrás que hacer una nueva lectura.

- Te recomiendo que pongas en el bucle un retardo de tiempo de 500 ms para que de tiempo al puerto a recibir datos y no satures el microprocesador.

- Te recomiento también, que no leas datos del puerto a no ser que haya un número mínimo de bytes en el puerto.

 

Saludos y suerte.

_________________________________________
https://aulamoisan.uva.es

0 kudos
Mensaje 2 de 32
5.361 Vistas

Hola moisan, muchas gracias por tu respuesta. 

 

- La opción de poner el guardado dentro del case ya lo había hecho, pero es igual, me sigue guardando lineas vacías. Adjunto archivo.

- Los datos están continuamente llegando al puerto serie. Arduino está de forma continua leyendo la entrada, a la que está conectado un multiplexor con 8 sensores (uno en cada entrada de éste), por lo que siempre van a llegar datos.

 

 No consideras los datos que llegan por el puerto después después de P, A y fin de línea. Lo suyo es que esos datos los vuelvas a tratar (buscando P, A y fin de línea) hasta que no queden datos por tratar que tendrás que hacer una nueva lectura.

 

Creo que esto si que lo estoy haciendo, si simulas paso a paso, una vez separados todos los datos que hay entre P y A con un salto de línea, vuelve a leer el puerto serie.

 

-No puedo poner un delay en el bucle, por que tarda múchísimo en hacer una lectura. La finalidad de este trabajo es captar a la máxima velocidad que me permita arduino.

 

Saludos.

0 kudos
Mensaje 3 de 32
5.355 Vistas

BrejBoriv escribió:

Hola moisan, muchas gracias por tu respuesta. 

 

- La opción de poner el guardado dentro del case ya lo había hecho, pero es igual, me sigue guardando lineas vacías. Adjunto archivo.

- Los datos están continuamente llegando al puerto serie. Arduino está de forma continua leyendo la entrada, a la que está conectado un multiplexor con 8 sensores (uno en cada entrada de éste), por lo que siempre van a llegar datos.

 

 No consideras los datos que llegan por el puerto después después de P, A y fin de línea. Lo suyo es que esos datos los vuelvas a tratar (buscando P, A y fin de línea) hasta que no queden datos por tratar que tendrás que hacer una nueva lectura.

 

Creo que esto si que lo estoy haciendo, si simulas paso a paso, una vez separados todos los datos que hay entre P y A con un salto de línea, vuelve a leer el puerto serie.

 

-No puedo poner un delay en el bucle, por que tarda múchísimo en hacer una lectura. La finalidad de este trabajo es captar a la máxima velocidad que me permita arduino.

 

Saludos.


Hola de nuevo:

 

- En la figura adjunta te propongo una solución para considerar los datos restantes (mediante Shift Register). Te digo que no consideras los datos restantes porque cuando lees el puerto serie lo que hace es descargar el buffer, por lo que una nueva lectura elimina los datos que no hayas tratado de la lectura anterior.

 

- Aunque pongas un delay no tienes que perder datos, que están en el buffer, lo que conseguirás es disminuir el número de lecturas (que no de datos) con lo que el programa será más eficiente.

 

- No tratas la posibilidad de que lleguen pocos bytes al puerto (al no encontrar P ó A, pone vacíos).

 

Saludos y suerte.

 

Comunica.png

_________________________________________
https://aulamoisan.uva.es

0 kudos
Mensaje 4 de 32
5.348 Vistas

Gracias. 

 

Consideraré esto.

 

PD. No adjuntaste imagen alguna. Me sería de gran ayuda.

0 kudos
Mensaje 5 de 32
5.343 Vistas

Tienes razón, disculpa.

Comunica.png

_________________________________________
https://aulamoisan.uva.es

0 kudos
Mensaje 6 de 32
5.339 Vistas

 

- No tratas la posibilidad de que lleguen pocos bytes al puerto (al no encontrar P ó A, pone vacíos).

 

Creo que por aquí puede venir el problema, pero no tengo ni idea como hacerlo. Alguna ayuda?. Gracias.

0 kudos
Mensaje 7 de 32
5.321 Vistas
Solución
Aceptado por el autor del tema BrejBoriv

BrejBoriv escribió:

 

- No tratas la posibilidad de que lleguen pocos bytes al puerto (al no encontrar P ó A, pone vacíos).

 

Creo que por aquí puede venir el problema, pero no tengo ni idea como hacerlo. Alguna ayuda?. Gracias.


Tienes varias maneras, pero una de ellas es que si en la cadena no encuentras ni la P ni la A, no procedas a grabar datos que serán vacíos.

 

Te adjunto figura para mayor claridad.

Comunica 2.png

_________________________________________
https://aulamoisan.uva.es

Mensaje 8 de 32
5.317 Vistas

Hola de nuevo.

 

Antes de nada, muchas gracias por la respuesta. Me sirvió de ayuda, aunque tengo que decir que funciona medianamente. Me sigue guardando vacios en el archivo.

 

En el  programa final, existen 5 bloques como el de la figura de arriba (en total 6, uno por por cada canal o lo que es lo mismo uno por cada entrada analógica de arduino.). Los datos que recibo por el puerto serie los adjunto en el archivo.

 

Es decir, recibo un caracter "P" que me indica inicio de cadena, seguido de ocho valores decimales separados con un salto de linea y renorno "/r/n" y después del último valor una "A" que me indica final de valores de primer canal y comienzo del segundo canal...

 

La cuestión está en que cuando están los 6 canales activos (0 a 5), la captura de datos se hace muy lenta, y llegan a entremezclarse valores de un canal a otro (labview no hace bien la separación con /r/n). No ocurre siempre, sólo a veces.

 

Por otra parte, ¿que otra forma tengo de tratar la posibilidad de que lleguen pocos bytes al puerto?.

 

 

Gracias.

0 kudos
Mensaje 9 de 32
5.230 Vistas

BrejBoriv escribió:

Hola de nuevo.

 

Antes de nada, muchas gracias por la respuesta. Me sirvió de ayuda, aunque tengo que decir que funciona medianamente. Me sigue guardando vacios en el archivo.

 

En el  programa final, existen 5 bloques como el de la figura de arriba (en total 6, uno por por cada canal o lo que es lo mismo uno por cada entrada analógica de arduino.). Los datos que recibo por el puerto serie los adjunto en el archivo.

 

Es decir, recibo un caracter "P" que me indica inicio de cadena, seguido de ocho valores decimales separados con un salto de linea y renorno "/r/n" y después del último valor una "A" que me indica final de valores de primer canal y comienzo del segundo canal...

 

La cuestión está en que cuando están los 6 canales activos (0 a 5), la captura de datos se hace muy lenta, y llegan a entremezclarse valores de un canal a otro (labview no hace bien la separación con /r/n). No ocurre siempre, sólo a veces.

 

Por otra parte, ¿que otra forma tengo de tratar la posibilidad de que lleguen pocos bytes al puerto?.

 

 

Gracias.


Hola, de nuevo:

 

Para tratar que lleguen pocos bytes al puerto, lo puedes hacer con la función Bytes at Port que devuelve el número de bytes. Si es menor de una determinada cantidad, no leas los datos y espera a que haya datos suficientes.

 

Si compruebas que te aparecen los caracteres de inicio y final, y no tratas los datos hasta que no lleguen correctamente los datos, conseguirás que no te parezcan vacíos en el fichero.

 

Para que la comunicación sea más rápida, es mejor que esperes a que el buffer tenga todos los datos correspondientes a los 5 canales, y leas solo cuando están todos los datos en el buffer. Porque si lees continuamente, estás ejecutando una acción que ralentiza el programa y en muchos casos puede que no haya datos.

 

Te vuelvo a repetir que es bueno poner un retardo al programa de 100ms (o incluso 500ms), lo que va a liberar el funcionamiento del microprocesador. Y no vas a perder datos porque los va almacenando en el buffer. No vas a notar por 100ms o 500ms el retardo, y el programa irá mucho más fluido. Las comunicaciones serie no suelen hacerse en intervalos menores de 0,5 segundos.

 

Saludos y suerte.

_________________________________________
https://aulamoisan.uva.es

0 kudos
Mensaje 10 de 32
5.205 Vistas