在嵌入式C中使用浮点数与sprintf()

有人,我想知道浮点变量是否可以在sprintf()函数中使用。

喜欢,如果我们写:

sprintf(str,"adc_read = %d \n",adc_read);

其中adc_read是整数变量,它将存储字符串

"adc_read = 1023 \n"

在str(假设adc_read = 1023)

如何使用float变量代替整数?

由于您在嵌入式平台上,因此您无法从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来回应其他答案之一。我发现以下网页似乎描述了在printf()语句here中使用%f所需要做的事情。

正如我原来怀疑的那样,您需要做一些额外的工作来获得浮点支持。这是因为嵌入式的东西很少需要浮点数(至少没有我做过的东西)。它涉及在makefile中设置额外的参数,并链接额外的库。

然而,由于需要处理一般的输出格式,这可能会增加你的代码大小。如果你可以将你的浮点数限制在4位小数以内,我建议把代码转换成一个函数,只是使用这个函数,这样可能会占用更少的空间。

万一链接消失了,你要做的是确保你的gcc命令有“-Wl,-u,vfprintf -lprintf_flt -lm”。这意味着:

>强制vfprintf最初未定义(以便链接器必须解决它)。
>指定用于搜索的浮点printf()库。
>指定搜索的数学库。

http://stackoverflow.com/questions/905928/using-floats-with-sprintf-in-embedded-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在嵌入式C中使用浮点数与sprintf()