Discusiones sobre Productos NI

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

¿Cómo manejar velozmente un rs 422 en labwindows cvi8?

Si, esta es la idea. Si puedes tener varios mensajes en la cola puede serque debas volver a usar el while para procesar todos los que hayas; debes considerar salir del while cuando no haya más mensajes por recibir y hayas manejado todos los que hayas recibido (u tengas en el buffer menos bytes del mensaje más cortos que recibas).

 

Mientras estamos viendo tu problema me entero de que hay mucho trabajo si veramente en 5 mseg puedes tener por ejemplo 5 mensajes por procesar! En este caso podrías ver dos cosas:

1. Usar a un timer asíncrono en vez del un timer estándard del CVI. El timer asíncrono lo encuentras en <cvidir>\toolslib\toolbox\asynctmr.fp También hay ejemplos en el uso de este instrumento que puedes encontrar en el example finder (Help >> Find examples)

2. Pasar los datos a la routina que los maneja con un PostDeferredCall en vez de una llamada directa para exitar de la timer callback lo más rápido posible. Deberás crear la memoria con malloc en la routina del timer, llenarla con los datos, pasar la dirección en la callback de la PostDeferredCall y liberar la memoria en la routina final: de otras maneras no vas a encontrar nada cuándo se ejecuta la routina diferita



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 11 de 14
691 Vistas

Si, esta es la idea. Si puedes tener varios mensajes en la cola puede serque debas volver a usar el while para procesar todos los que hayas; debes considerar salir del while cuando no haya más mensajes por recibir y hayas manejado todos los que hayas recibido (u tengas en el buffer menos bytes del mensaje más cortos que recibas).

 

Mientras estamos viendo tu problema me entero de que hay mucho trabajo si veramente en 5 mseg puedes tener por ejemplo 5 mensajes por procesar! En este caso podrías ver dos cosas:

1. Usar a un timer asíncrono en vez del un timer estándard del CVI. El timer asíncrono lo encuentras en <cvidir>\toolslib\toolbox\asynctmr.fp También hay ejemplos en el uso de este instrumento que puedes encontrar en el example finder (Help >> Find examples)

2. Pasar los datos a la routina que los maneja con un PostDeferredCall en vez de una llamada directa para exitar de la timer callback lo más rápido posible. Deberás crear la memoria con malloc en la routina del timer, llenarla con los datos, pasar la dirección en la callback de la PostDeferredCall y liberar la memoria en la routina final: de otras maneras no vas a encontrar nada cuándo se ejecuta la routina diferita



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?
Mensaje 12 de 14
690 Vistas

Muchas gracias Roberto, voy a tratar de hacerlo así, antes una ultima pregunta. ¿entonces no es posible tratar los mensajes en tiempo real?, es decir, llega uno, lo trato, llega otro, lo trato, así sin perder ninguno?

0 kudos
Mensaje 13 de 14
688 Vistas

Hola JG,

 

Para poder reaccionar a eventos provenientes del puerto serie, puedes utilizar varias opciones (http://digital.ni.com/public.nsf/allkb/96D5CA4F03EDBC3686256D9100495C0F?OpenDocument   este ejemplo puede serte de interes   http://zone.ni.com/devzone/cda/epd/p/id/4297) entre las que se encuentran las que te ha comentado Roberto. Con estas opciones puedes monitorizar el puerto serie y ver cuando te llegan nuevas tramas. Si utilizas un sistema operativo en tiempo real, la temporización de tu procesos la podrás hacer respecto a un reloj de us, por lo que si el tiempo que necesitas para generar la respuesta es reducido y colocas la tarea como prioridad crítica, podrías poder cerrar el lazo en el tiempo que necesitas. En cualquier caso, dependerá del tiempo de procesado que le lelve a tu equipo responder a una trama.

0 kudos
Mensaje 14 de 14
677 Vistas