Discusiones sobre Productos NI

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

recibir datos via USB LabWindows CVI

¡Resuelto!
Ir a solución

Hola de nuevo Roberto,

 

ya he solucionado el tema del timer asincrono, ya está andando, pero vuelvo a tener problemas con el puerto serie. Me hace bien la lectra del serial hasta que llega más o menos a la muestra 1200aprox, y empiezan a dar valores erroneos. Tiene alguna idea de que puede estar pasando?

0 kudos
Mensaje 21 de 29
1.720 Vistas

No tengo ideas. Podrías averiguar si la lectura está al paso de la transmisión visualizando la cola en el puerto con GetInQLen cada vez que lees: a ver si estamos llenando el buffer así que alguna lectura se pierde



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 22 de 29
1.714 Vistas

He bajado la velocidad a 9600 y va perfecto, asi que imagino que tendre que ¿sincronizar la velocidad del puerto con la del timer?

0 kudos
Mensaje 23 de 29
1.710 Vistas

Bueno, de alguna manera ambos procesos debe ir juntos: si el timer es lento el buffer del puerto se va llenando y algun dato puede perderse.

Idealmente deberías tener el timer un poquito mas rápido del Arduino para no perder ningun dato y no ir llenando la cola en el tiempo. Alternativamente puedes leer más mensajes en cada ejecución del timer: en este caso pon cuidado con el tiempo de timeout para no bloquear el sistema (SetComTime).



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 24 de 29
1.696 Vistas

Buenos días Roberto,

 

He comprobado el tiempo que tarda Arduino en mandarme los datos por el serial, y he obtenido los siuientes resultados:

 

Capturatiempos.JPG

 

Ahora la cuestión es, que la recepción de datos la he logrado poner en un Timer Asíncrono, pero la máxima velocidad a la que no tengo problemas es, como ya te dije, 57600.

 

Mi pregunta es. ¿Para poder adquirir datos a mayor velocidad he de cambiar la resolución del Timer? Es decir, cambiar su resolución y ponerla un poco más rápido que el tiempo de envío de datos. Ahora mismo lo que estoy haciendo es usar GetAsyncTimerResolution para obtener la resolución.

 

Muchas gracias.

0 kudos
Mensaje 25 de 29
1.691 Vistas

Bueno, puesto así creo que es necesario un cambio de estructura. En efecto si vas a 57600 estas recibiendo una muestra cada 2 millisegundos, esto es: el sistema va ¡muy rápido!

Creo que la transmisión se daña a velicdad superiores porque el timer no puede bajar debajo de 1 mseg como resolución, así que practicamente aunque corra continuamente no puede seguir el Arduino procesando una muestra para cada ejecución.

 

Podrías intentar pasar al multithreading, con un thread separado que siempre corra en un loop procesando continuamente la transmisión, dejando libre el thread principal para ocuparse del la UI. Igualmente, debes simplificar mucho este thread para que corra mas rápido posible procesando todos los mensajes.



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 26 de 29
1.683 Vistas

OK¡¡  Intentare con multithreading a ver si fnciona mejor ¡¡ 

 

Gracias ¡¡

0 kudos
Mensaje 27 de 29
1.657 Vistas

Hola Roberto,

 

efectivamente he creado un hilo nuevo para la adquisicion de los datos y va bastante mejor. Ahora toca ver como operar con multithrading.

 

Muchas gracias, 

Saludos

0 kudos
Mensaje 28 de 29
1.648 Vistas

Me alegro que las cosa vayan solucionandose.

Suerte con tu proyecto Emoticono feliz



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 29 de 29
1.644 Vistas