由于您使用的是嵌入式平台,因此您很可能没有 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 是可以表示的最大 10 次幂)。
但是,有一些方法可以通过进一步处理小数部分,每次将其移动四位小数(并使用/减去整数部分),直到获得所需的精度。
更新:
您提到的最后一点是您在回复其他答案之一时使用了avr-gcc。我发现以下网页似乎描述了在 printf() 语句 here 中使用 %f 需要做什么。
正如我最初所怀疑的那样,您需要做一些额外的工作才能获得浮点支持。这是因为嵌入式东西很少需要浮点(至少我做过的东西都没有)。它涉及在您的 makefile 中设置额外的参数并与额外的库链接。
但是,由于需要处理通用输出格式,这可能会大大增加您的代码大小。如果您可以将浮点输出限制为小数点后 4 位或更少,我建议将我的代码变成一个函数并直接使用它 - 它可能占用更少的空间。
万一该链接消失,您需要做的是确保您的 gcc 命令具有 "-Wl,-u,vfprintf -lprintf_flt -lm"。这转换为:
- 强制 vfprintf 最初未定义(以便链接器必须解析它)。
- 指定浮点
printf()库进行搜索。
- 指定要搜索的数学库。