Dado que está en una plataforma integrada, es muy posible que no tenga todas las capacidades de las funciones de estilo printf()
.
Asumiendo que tiene flotadores en absoluto (todavía no necesariamente un dadas para la materia integrado), puede emular con algo como:
char str[100];
float adc_read = 678.0123;
char *tmpSign = (adc_read < 0) ? "-" : "";
float tmpVal = (adc_read < 0) ? -adc_read : adc_read;
int tmpInt1 = tmpVal; // Get the integer (678).
float tmpFrac = tmpVal - tmpInt1; // Get fraction (0.0123).
int tmpInt2 = trunc(tmpFrac * 10000); // Turn into integer (123).
// Print as parts, note that you need 0-padding for fractional bit.
sprintf (str, "adc_read = %s%d.%04d\n", tmpSign, tmpInt1, tmpInt2);
Tendrá que restringir el número de caracteres vienen después del punto decimal basa en los tamaños de tus enteros.Por ejemplo, con un entero con signo de 16 bits, está limitado a cuatro dígitos (9.999 es la mayor potencia de diez menos uno que se puede representar).
Sin embargo, hay formas de manejar esto procesando aún más la parte fraccionaria, cambiándola por cuatro dígitos decimales cada vez (y usando/restando la parte entera) hasta que tenga la precisión que desea.
Actualización:
Un punto final que usted ha mencionado que estaba utilizando avr-gcc
en una respuesta a una de las otras respuestas. Encontré la siguiente página web que parece describir lo que necesita hacer para usar %f
en sus declaraciones printf()
here.
Como sospechaba originalmente, necesita hacer un poco de trabajo extra para obtener soporte de punto flotante. Esto se debe a que las cosas integradas raramente necesitan punto flotante (al menos ninguna de las cosas que he hecho alguna vez). Implica establecer parámetros adicionales en su archivo MAKE y vincularlos con bibliotecas adicionales.
Sin embargo, es probable que aumente un poco el tamaño del código debido a la necesidad de manejar formatos de salida generales. Si puedes restringir tus salidas de flotación a 4 lugares decimales o menos, te sugiero convertir mi código en una función y solo usar eso, es probable que ocupe mucho menos espacio.
En caso de que el enlace nunca desaparece, lo que tiene que hacer es asegurarse de que su comando gcc tiene "-Wl,-u,vfprintf -lprintf_flt -lm
" Esto se traduce en:.
- fuerza vfprintf que no está definido inicialmente (de modo que el enlazador tiene que resolver ella).
- especificar la biblioteca de punto flotante
printf()
para la búsqueda.
- especifique la biblioteca matemática para la búsqueda.
Lo C-biblioteca se le vincula en contra? – sybreon
Tenga en cuenta que está tratando de formatear un doble. Con varargs el compilador automáticamente promocionará un valor flotante al doble. – Richard
"Embedded", muchachos. Esa es la clave. No importa lo que sus bibliotecas de lujo-shmancy hagan en sus máquinas con GB de memoria :-) Las plataformas integradas generalmente tienen ventajas y desventajas con el objetivo de minimizar la huella de memoria. – paxdiablo