:::: MENU ::::

Преобразование строки с числом в целочисленную переменную и наоборот

Задача преобразования строки с числом в целочисленную переменную и наоборот, например, может понадобиться для вывода на дисплей каких либо значений в вашей программе.

В стандартной библиотеке для этих целей есть atoiitoa, sprintf, sscanf. Но библиотеки для микроконтроллеров могут не содержать их. Или вам нужно преобразовывать строку без нуль символа в конце — тогда надо писать свою реализацию.

Приведем простой пример таких реализаций (код простой и должен быть понятен без пояснений).

Строку в число unsigned int (принимает строку и количество символов в строке, которое нужно расшифровать):

uint8_t str_to_dig_u8b(char *str, uint8_t num)
{
    uint8_t dig;
    char s1, s2, s3;

    s1 = str[0];
    s2 = str[1];
    s3 = str[2];

    switch(num)
    {
        case 1:
            dig = (s1 - 0x30);
        break;

        case 2:
            dig = (s1 - 0x30)*10 + (s2 - 0x30);
        break;

        case 3:
            dig = (s1 - 0x30)*100 + (s2 - 0x30)*10 + (s3 - 0x30);
        break;
    }
    return(dig);
}

Из числа unsigned int в строку (принимает строку в которую выводим результат само число и количество символов в этом числе; если надо преобразовать все число — передаем 0 и count_num сама посчитает сколько символов в вашем числе):

void dig_to_str_u8b(char *str, uint8_t dig, uint8_t num) 
{
    if(num == 0)
        num = count_num(dig, U8B);

    switch(num)
    {
        case 1:
            str[0] = (dig % 10) + 0x30;
        break;

        case 2:
            str[0] = ((dig % 100) / 10) + 0x30;
            str[1] = (dig % 10) + 0x30;
        break;

        case 3:
            str[0] = ((dig % 1000) / 100) + 0x30;
            str[1] = ((dig % 100) / 10) + 0x30;
            str[2] = (dig % 10) + 0x30;
        break;
    }
}

count_num — функция подсчета символов в числе.

static inline uint8_t count_num(uint32_t dig, uint8_t f_n_bit)
{
    uint8_t num = 0;

    if(f_n_bit == U8B)
    {
        if( (dig / 100) != 0)
            num = 3;
        else if( (dig / 10) != 0)
            num = 2;
        else
            num = 1;
    }

    else if(f_n_bit == U16B)
    {
        if( (dig / 10000) != 0)
            num = 5;
        else if( (dig / 1000) != 0)
            num = 4;
        else if( (dig / 100) != 0)
            num = 3;
        else if( (dig / 10) != 0)
            num = 2;
        else
            num = 1;
    }

    else if(f_n_bit == U32B)
    {
        if( (dig / 1000000000) != 0)
            num = 10;
        else if( (dig / 100000000) != 0)
            num = 9;
        else if( (dig / 10000000) != 0)
            num = 8;
        else if( (dig / 1000000) != 0)
            num = 7;
        else if( (dig / 100000) != 0)
            num = 6;
        else if( (dig / 10000) != 0)
            num = 5;
        else if( (dig / 1000) != 0)
            num = 4;
        else if( (dig / 100) != 0)
            num = 3;
        else if( (dig / 10) != 0)
            num = 2;
        else
            num = 1;
    }

    return(num);
}

Пример использования (установка и получение времени RTC stm32l):

uint8_t hour;
uint8_t min;
uint8_t sec;

hour = str_to_dig_u8b((char*)&TIME_SETTING.time[0], 2);
min = str_to_dig_u8b((char*)&TIME_SETTING.time[3], 2);
sec = str_to_dig_u8b((char*)&TIME_SETTING.time[6], 2);

******************************************************

RTC_TimeTypeDef RTC_TimeStructure;

RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);

dig_to_str_u8b((char*)&TIME_SETTING.time[0], RTC_TimeStructure.RTC_Hours, 2);
dig_to_str_u8b((char*)&TIME_SETTING.time[3], RTC_TimeStructure.RTC_Minutes, 2);
dig_to_str_u8b((char*)&TIME_SETTING.time[6], RTC_TimeStructure.RTC_Seconds, 2);

Таким же образом можно сделать преобразование в/из uint16_t и uint32_t. Полностью код вместе с uint16_t и uint32_tuser_stdlib.