单片机不支持printf 浮点类型的解决办法

在一些单片机中因为资源受限官方提供的SDK中通常不提供浮点类型数据的打印。如需浮点打印功能可以参考如下做法:

前提条件

  1. 串口通信正常
  2. printf 函数已经移植完成

操作方法

  1. 添加以下函数到工程,以下函数的作用为将一个float类型函数转换为一个字符串。
  2. 将转换完成的字符串通过printf("%s");进行输出打印。
/**
 * @brief 将float类型数据转换为字符串输出
 * 
 * @param num [IN] 要转换的数据
 * @param n [IN] 小数位的个数
 * @return uint8_t* [OUT] 转换完成的字符串的
 */
uint8_t *float2str(double num, int n)
{
    static uint8_t num_str[13] = {
        '\0'};
    uint8_t len = 0;
    uint8_t n_max = 0; //小数点最大位数
    uint32_t i = 0;

    for (i = 0; i < 13; i++) //字符串清空
        num_str[i] = '\0';
    //确定符号
    if (num > 0)
    {
        num_str[0] = '+';
    }
    else if (num < 0)
    {
        num_str[0] = '-';
        num = -num;
    }

    if ((int)(num / 100000) != 0)		//确定整数部分长度
    { // 6位数
        len = 7;
        n_max = 4;
    }
    else if ((int)(num / 10000) != 0)
    { // 5位数
        len = 6;
        n_max = 5;
    }
    else if ((int)(num / 1000) != 0)
    { // 4位数
        len = 5;
        n_max = 6;
    }
    else if ((int)(num / 100) != 0)
    { // 3位数
        len = 4;
        n_max = 7;
    }
    else if ((int)(num / 10) != 0)
    { // 2位数
        len = 3;
        n_max = 8;
    }
    else
    { // 1位数
        len = 2;
        n_max = 9;
    }

    if (n > n_max)				//小数点限幅
        n = n_max;
    len += n; 					//确定长度

    i = n;		 				//变成整数
    while (i--)
        num = (num * 10);

    while (n--)					 //转换小数
    {
        num_str[len--] = (int)num % 10 + 0x30;
        num = num / 10;
    }
    num_str[len] = '.';

   
    while (len--)				 //转换整数
    {
        num_str[len] = (int)num % 10 + 0x30;
        num = num / 10;
        if (len == 1)
            break;
    }
    return num_str;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值