Precisión de datos variables double y float

Jose Manuel perez
25 de Octubre del 2012
Hola a todos, ante todo me presento, me llamo Jose y estoy desarrollando un programa para Arduino conectado a mi ordenador mediante LabView.

Desde LabView envio variables cuyo contenido es el retardo en microsegundos para unas determinadas rutinas que necesito que Arduino realice.

Dado que necesito que en LabView los datos se muestren en microsegundos, envio mediante variables del tipo unsigned long (4 bytes) los datos a Arduino. Los datos los recibe correctamente Arduino. Pero luego necesito que almacene en una variable los microsegundos por lo que divido por mil la variable enviada por LabView, el resto de la division lo multiplico por mil y de esta forma tengo una variable en milisegundos y otra variable en microsegundos. La razón es que lo que envio desde LabView tiene un tamaño superior al argumento que la función de microsegundos puede manejar, por lo que he de convertir a milisegundos mediante esa división, y el resto de la misma ya si se puede manejar con la funcion de retardo de microsegundos.

El problema viene que luego, para comprobar que Arduino procesa esos datos bien, recompongo el valor inicial, multiplicando por mil la variable de millisegundos y sumando a ese resultado la variable de microsegundos. Bien, lo que me sucede es que el ultimo numero me baila, es decir, si envio por ejemplo el valor 111111 lo que recibo es 111110, o si envio 324567 recibo 324566. Hay algo que no me acaba de funcionar..., la parte importante del código es el siguiente:

unsigned long duration;


void convertir datos()
{
double temp1;
double temp2;

/* Recibo los datos de LabView mediante una función y compruebo que se reciben bien */

temp1 = ((float) duration)/1000;

CAM.Tonus = 1000*modf(temp1, &temp2);
CAM.Tonms = tempdouble;

}

void EnviarDatosLabView()
{
duration = ((CAM.Tonms)*1000)+CAM.Tonus;

/* A continuación mediante una función envio los datos de duration a LabView y dicho valor es el que el ultimo número me varía */

}

A ver si veis donde puede estar el problema, está claro que es algo relacionado con la conversión de tipos y/o precisión...

Gracias de antemano,

Jose