【问题标题】:Conversion from float to char array从浮点数转换为字符数组
【发布时间】:2016-01-12 09:34:18
【问题描述】:

我需要将我的 float(传感器)值转换为 char 数组,以便通过 GPRS 发送我的数据。如果我使用任何库函数进行转换,它会占用大量内存,因为控制器的闪存量较少。我已经尽力在没有库函数的情况下转换数据,但最终它需要 math.h 文件。在没有任何库函数的情况下如何解决这个问题?

#include <stdio.h>
#include <string.h>
#include <math.h>
unsigned char str[20];
unsigned char *ftos(float f,int precision)
{
    memset(str,0,sizeof(str));
    float ff;
    ff = f;
    int a,b,c,k,l=0,m,i=0;
    // check for negetive float
    if(f<0.0)
    {
        str[i++]='-';
        f*=-1;
    }
    a=f;    // extracting whole number
    f-=a;   // extracting decimal part
    k = precision;
    // number of digits in whole number
    while(k>0)
    {
        l = pow(10,k);
        m = a/l;
        if(m>0)
        {
            break;
        }
    k--;
    }
    // number of digits in whole number are k+1

    /*
    extracting most significant digit i.e. right most digit , and concatenating to string
    obtained as quotient by dividing number by 10^k where k = (number of digit -1)
    */
    for(l=k+1;l>0;l--)
    {
        b = pow(10,l-1);
        c = a/b;
        str[i++]=c+48;
        a%=b;
    }
    str[i++] = '.';
    /* extracting decimal digits till precision */
    for(l=0;l<precision;l++)
    {
        f*=10.0;
        b = f;
        str[i++]=b+48;
        f-=b;
    }
    str[i]='\0';
    return str;
}

int main()
{
    float temp = 35.2;
    printf("%s",ftos(temp,2));
}  

【问题讨论】:

  • 使用 math.h 文件有什么问题?
  • 为什么要将其编码为字符串?你考虑过吗?
  • 这显然是微控制器的问题。传感器值的范围和精度是多少?微控制器上的最佳选择是转换为定点(整数)格式,并将其用于输出。如果传感器值的范围和精度已知,我可以显示一些示例代码。对于真正内存受限的微控制器,您甚至可以避开缓冲区,仅在发送每个字符(数字或小数点)时生成它。
  • 你看到这篇文章了吗? stackoverflow.com/questions/7228438/…
  • 在资源受限的 MCU 中遇到浮点数时的常见问题:为什么首先使用浮点数而不是原始整数值?你的硬件里有 FPU 吗?

标签: c arrays floating-point embedded microcontroller


【解决方案1】:

不要尝试打印浮点值,而是打印定点值。例如,这将打印值 x,小数点后有 2 位:

int main()
{
    float x = 35.2;
    printf("%d.%02d\n", (int)x, (int)(x * 100) - (int)x * 100);
}

如果您需要将值实际转换为 char 数组,请使用 sprintf 而不是 printf。乘法时要小心避免整数溢出,特别是如果您的平台有 16 位整数:如果需要,请使用 long 值。

总体而言,在微控制器 C 代码中打印浮点数是个好主意的情况很少。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2010-10-23
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多