Поскольку вы работаете на встроенной платформе, вполне возможно, что вы не обладаете полным спектром возможностей от функций printf()
-тиля.
Предполагая, что у вас вообще есть плавающие объекты (все еще не обязательно заданные для встроенных объектов), вы можете эмулировать их примерно так:
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);
Вам нужно будет ограничить количество символов после десятичной дроби в зависимости от размеров ваших целых чисел. Например, с 16-разрядным целым числом со знаком вы ограничены четырьмя цифрами (9 999 - это наибольшая степень десяти-минус единицы, которую можно представить).
Однако есть способы справиться с этим, дополнительно обрабатывая дробную часть, каждый раз сдвигая ее на четыре десятичных знака (и используя / вычитая целую часть), пока не получите желаемую точность.
Обновление:
В заключение вы упомянули, что вы использовали avr-gcc
в ответе на один из других ответов. Я нашел следующую веб-страницу, которая, кажется, описывает, что вам нужно сделать, чтобы использовать %f
в ваших printf()
заявлениях здесь .
Как я изначально подозревал, вам нужно проделать дополнительную работу, чтобы получить поддержку с плавающей запятой. Это потому, что встроенному материалу редко требуется плавающая точка (по крайней мере, ни один из вещей, которые я когда-либо делал). Он включает установку дополнительных параметров в вашем make-файле и связывание с дополнительными библиотеками.
Однако, это может немного увеличить размер вашего кода из-за необходимости обрабатывать общие выходные форматы. Если вы можете ограничить число выводов с плавающей запятой до 4 десятичных разрядов или меньше, я бы предложил превратить мой код в функцию и просто использовать ее - это, вероятно, займет намного меньше места.
В случае, если эта ссылка когда-либо исчезнет, вам нужно убедиться, что ваша команда gcc имеет "-Wl,-u,vfprintf -lprintf_flt -lm
". Это означает:
- заставляет vfprintf изначально быть неопределенным (так что компоновщик должен разрешить его).
- указать библиотеку с плавающей точкой
printf()
для поиска.
- указать математическую библиотеку для поиска.