el 04-04-2011 03:57 AM
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
el 04-04-2011 03:57 AM
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
el 04-04-2011 04:12 AM
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?
el 04-06-2011 12:28 PM
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.