2016-01-12 3 views
0

Мне нужно преобразовать значение float (sensor) в массив char для отправки моих данных через GPRS. Если я использую любую библиотечную функцию для преобразования, она занимает много памяти, потому что у контроллера меньше времени. Я попытался изо всех сил преобразовать данные без библиотечной функции, но, наконец, необходимо обязательно загрузить файл math.h. Как я могу решить эту проблему без какой-либо функции библиотеки?Преобразование из массива float в char

#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)); 
} 
+4

Что случилось с использованием файла math.h? –

+0

Зачем вам кодировать его как строку? Вы задумались об этом? –

+1

Это, очевидно, проблема с микроконтроллером. Каков диапазон и точность значения датчика? Наилучшим вариантом на микроконтроллере является преобразование в формат фиксированной точки (целочисленный) и использование этого для вывода. Я мог бы показать примерный код, если бы был известен диапазон и точность значения датчика. Для действительно микроконтроллеров с ограничением памяти вы можете даже избежать буфера, генерируя каждый символ (цифру или десятичную точку) только при его отправке. –

ответ

1

Не пытайтесь напечатать значение с плавающей запятой, вместо этого напечатайте значение с фиксированной точкой. Например, это выводит значение x с 2 знаками после запятой:

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

Если вам нужно на самом деле преобразования значения в массив символов, используйте sprintf вместо printf. Будьте осторожны, чтобы избежать целочисленного переполнения при умножении, особенно если ваша платформа имеет 16-разрядные целые числа: используйте значения long, если это необходимо.

В целом, очень мало случаев, когда печать чисел с плавающей точкой является хорошей идеей из кода микроконтроллера C.

Смежные вопросы