05-07-2016 03:23 AM - editado 05-07-2016 03:41 AM
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.
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.
¡Resuelto! Ir a solución.
el 05-07-2016 03:47 AM
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.
el 05-07-2016 04:13 AM
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.
05-07-2016 04:32 AM - editado 05-07-2016 04:43 AM
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.
el 05-07-2016 04:41 AM
Gracias.
Consideraré esto.
PD. No adjuntaste imagen alguna. Me sería de gran ayuda.
el 05-07-2016 04:43 AM
Tienes razón, disculpa.
05-07-2016 07:56 AM - editado 05-07-2016 07:57 AM
- 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.
el 05-07-2016 08:11 AM
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.
el 05-17-2016 06:00 PM
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.
el 05-18-2016 06:07 AM
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.