-
Sucede que estoy trabajando con CCS, intento recibir un float por RS232, cuyos dígitos están separados en cada byte que me manda. Es decir, me llegan 21 btes, de esos 21 9 corresponden al numero float.
Me explico mejor:
llegan: 1,2,3,4,5,6,7,8,9 que uniéndolos me deben quedar 123456,789.
Entonces, yo lo que hago es esto:
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[6]*100000);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[7]*10000);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[8]*1000);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[9]*100);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[10]*10);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[11]*1);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[12]/10);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[13]/100);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[14]/1000);
Si se puede hacer esto? No me esta funcionando... :?
Si yo hago previo a lo anterior esto:
For(i=6;i<15;i++)Buffer_in[i]=1;//<-------------- DEBUG BORRAR
Pues me esperaria 111111,111.
Y me aparece 143.000 en la LCD. :? :? :?
Ya estoy loco con esto. Me pueden indicar si yo estoy haciendo mal las cosas por favor. :mrgreen: Gracias!!
-
Hola.
Que tipo de variable es valor_recarga? me imagino que float.
Porque no usar mejor una de las funciones para pasar de string a float directamente?
saludos
-
MLO, efectivamente Valor_Recarga es Float.
Y cuales son esas funciones??
-
Esto es lo que intento hacer:
(http://img510.imageshack.us/img510/5135/dibujoto0.jpg)
Primer paso.
Lleno el buffer de 1 decimal.
Segundo paso:
Tomo los valores en el buffer y los meto en la variable Valor_Recarga.
Tercer paso:
Guardo Valor_Recarga en la EEprom interna y tambien lo guardo en otrass posiciones como Backup por si se borra (Que no es raro en los PICs). Y luego leo lo que acabo de escribir, para corroborar que quedo bien escrito.
Si fijan agregue unos Printf despues de haber calculado y otro despues de guardar y leer nuevamente lo guardado. pues eso me dio la LUZ.
El calculo lo hace bien, pero al guardar en la eeprom y leer nuevamente, es donde sale el dato mal. Entonces, el problema esta es en la rutina de guardar y leer en la eeprom.
Ahora, esa es la que uso siempre, y ahora me viene a dar problemas... :?
-
Hola Ernesto.
Me da la impresión que estas haciendo el moldeado de los caracteres mal. Tu haces:
(float)(Buffer_in[7]*10000)
Con lo que estas multiplicando por 10.000 el valor del caracter ascii (en el caso de contener un "1" seria, 31*10.000), con lo cual primero debes de convertir a número y despues multiplicar.
Suponiendo que funcione en este caso el moldeado de la variable, tendriamos:
((float)(Buffer_in[7]))*10000
Con lo cual convertimos primero a número y después multiplicamos.
Para convertir una cadena a numero se utiliza:
strtol(nptr,& endptr, base)
Con lo que podrías convertir directamente buffer_in en su número.
Un saludo
-
Mas claro, no puede estar.
Instale el CCS 3.249.. y SORPRESA!!!
La Escritura y lectura de la EEPROM funciona perfecto...PERO!! Ahora el calculo para sacar el Valor_Recarga no sirve, siempre da 0.000. Entonces en el programa después del intento de calcular, le doy un valor fijo a Valor_Recarga y efectivamente se graba y se lee bien de la eeprom. (Lo marque en el código para que vean donde es que coloque el valor fijo en la variable).
(http://img404.imageshack.us/img404/857/dibujo2mf3.jpg)
Entonces??
CCS 4.074 Funciona los calculos pero no almacenar en la EEPROM
CCS 3.249 Funciona almacenar en la EEPROM pero no los calculos.
Que hago? Creo que seria mejor cambiar la forma de hacer el calculo que la de almacenar en la EEPROM ¿No les parece?
Me pueden dar alguna guia por favor?
-
No amigo Jesus, en el Buffer no me llegan ascii, me llegan directamente enteros.
Bueno, cambie como me lo pediste Jesus, pero me sigue dando el resultado del calculo 0.000
quedo asi:
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[6]))*100000;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))*10000;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[8]))*1000;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[9]))*100;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))*10;
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[11]);
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))/10;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))/100;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))/1000;
Tambien intente con atof de la libreria stdlib.h y nada, me sigue dando 0.000
-
Prueba a usar la función que te pase.
Un saludo
-
Pero esa convierte a long, y Valor_Recarga es Float, por eso use atof, pero no se si la uso mal, yo hago esto:
Valor_Recarga=atof(Valor);
donde Valor es otra cadena pero llena de 1 decimal, esperaría al menos 11111 y nada, me entrega un 0.00
-
Otra cuestión.
Si quieres representar el número: 123456,789 mediante el printf, tendrás que poner:
printf("%10.3", Valor_Recarga);
Hay que indicarle el número total de caracteres a sacar (incluido el punto decimal) y seguido de un punto el número de decimales.
Un saludo
-
Hola.
La funcion que pasa de string a float es la funcion atof();
Saludos
-
Hola
No vi bien el ultimo pedazo de tu post en el que decias que no te funciono la funcion atof. A mi me funciona bien, tengo la version 4.057. Una cosa: el tamaño del vector que guarda al string que va a ser float debe finalizar en '\0' (o null) para que la funcion te retorne un valor, de modo contrario siempre sera 0.
Saludos
-
Hola!!
Ya me funciono!!!! :-/
Con la atof pude lograr que trabajara. El problema es que atof espera son ascii y yo le entregaba los enteros tal cual como me llegaban, ademas debe existir el "." para separar la parte entera de la decimal, y debe terminar la cadena de texto en 0.
Así me quedo el programa:
(http://img510.imageshack.us/img510/5677/dibujo3tq9.jpg)
Resalte como hago para pasar los enteros a ascii, colocarle el "." y ademas terminar la cadena en 0x00.
Hola MLO, contestaste mientras yo escribia. Si efectivamente el atof lo estaba usando mal yo. De resto va muy bien.
Quiero agradeceles a MLOy a Jesus, por darme el apunte de usar las funciones para pasar de string a float directamente.
GRACIAS!!!
PD: De todas maneras el CCS tiene un BUG mas. Con el PIC18F4550, la eeprom no graba bien los datos que se le dicen en las versiones 4.xxx y en las 3.xxx no realiza las operaciones con float bien.
-
:-/ :-/ :-/ :-/
Ok!!! un gusto para mi poder ayudarte
Saludos