在一些单片机中因为资源受限官方提供的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;
}
————————————————
版权声明:本文为CSDN博主「Argon_Ghost」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Argon_Ghost/article/details/123787706