你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeIDE printf浮点数,浮点数丢失数值

[复制链接]
Elsa_Li 提问时间:2024-5-29 16:57 / 未解决

1、芯片:STM32F103C8T6 2、环境:STM32CubeIDE 3、问题:printf浮点数,浮点数数值丢失 如 float A=25.6666;float B=24.7777; 实际打印出来: 第一种情况:A=2.0000;B=0.0000; 第二种情况:A=-2.0000; B=-26815615859885194199148049996411692254958731641184786755447122887443528060147093953603748596333806855380063716372972101707507765623893139892867298012168192.000000 偶尔会出现以上情况,除此之外正常打印浮点数。 4、已开启STM32CubeIDE打印浮点数,也加了Flag。 打印整数不会出现问题 尝试double A;double B;也会出现上述问题 以下是代码

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

double Printf_T_Set,Printf_T_Act;

Printf_T_Set = T_Set;

Printf_T_Act = T_Act;

if(htim->Instance == htim2.Instance)

{

if(printSoftwareVersion==1)

{

    printSoftwareVersion=0;

    printf("Software Version: M01_40mA_V03 \r\n");

}

if(printEnabled==1)

{

// printf("T-Set:%.4f \r\n",Printf_T_Set);

// printf("T-Act:%.4f \r\n",Printf_T_Act);

    printf("T-Set:%lf \r\n",Printf_T_Set);

    printf("T-Act:%lf \r\n",Printf_T_Act);

}

} }

ifdef GNUC

define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

else

define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

endif

PUTCHAR_PROTOTYPE

{

HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);//阻塞方式打印,串口1

return ch;

}

收藏 评论12 发布时间:2024-5-29 16:57

举报

12个回答
xmshao 回答时间:2024-5-29 18:02:23



有个地方的配置,别忽略了。工程属性下面\Tool setting\MCU Settings,
将Use float with printf ...勾选上。





输出结果是正常的:
while (1)
{
   /* USER CODE END WHILE */


   /* USER CODE BEGIN 3 */


value = value +0.0000001;
printf("**value = %3.20f  ** \n\r",value);


HAL_Delay(500);
}



结果输出没啥问题:
**value = 12.46480359999966047724  **
**value = 12.46480369999965986949  **
**value = 12.46480379999965926174  **
**value = 12.46480389999965865400  **
**value = 12.46480399999965804625  **
**value = 12.46480409999965743850  **
**value = 12.46480419999965683076  **
**value = 12.46480429999965622301  **
**value = 12.46480439999965561526  **
**value = 12.46480449999965500751  **
xmshao 回答时间:2024-5-29 21:21:27

我刚才基于STM32芯片在STM32CUBEIDE环境下,验证了浮点的打印,没有啥问题。

有个地方的配置,别忽略了。工程属性下面\Tool setting\MCU Settings,

将Use float with printf ...勾选上。

double value =12.4647478;

while (1)

{

value = value +0.0000001;

printf ("value = %3.20f \n\r",value);

HAL_Delay (500);

}

结果输出没啥问题:

value = 12.46480359999966047724

value = 12.46480369999965986949

value = 12.46480379999965926174

value = 12.46480389999965865400

value = 12.46480399999965804625

value = 12.46480409999965743850

value = 12.46480419999965683076

value = 12.46480429999965622301

value = 12.46480439999965561526

value = 12.46480449999965500751

李康1202 回答时间:2024-5-30 12:04:49

楼上说得对,还有就是把打印函数放到主函数试试、

Elsa_Li 回答时间:2024-5-30 16:00:57

xmshao 发表于 2024-5-29 21:21
我刚才基于STM32芯片在STM32CUBEIDE环境下,验证了浮点的打印,没有啥问题。</p>
<p>有个地方的配置,别忽略 ...

[md]1、STM32Cube已勾选打印浮点数的设置

2、代码是可以打印浮点数的,但偶尔会出现丢数据的情况,还是没有解决 3、在线debug已确认printf前,变量数值正常,printf后,实际打印与变量数值不同 image.png image.png

image.png
Elsa_Li 回答时间:2024-5-30 17:21:27

xmshao 发表于 2024-5-29 21:21
我刚才基于STM32芯片在STM32CUBEIDE环境下,验证了浮点的打印,没有啥问题。</p>
<p>有个地方的配置,别忽略 ...

[md]printf打印的值与实际变量值不同 5c955462d2cfabd391ab955e539c202b.png

Elsa_Li 回答时间:2024-5-30 17:31:54

李康1202 发表于 2024-5-30 12:04
楼上说得对,还有就是把打印函数放到主函数试试、

可以看到我其他的回复吗?谢谢

xmshao 回答时间:2024-5-30 21:42:00

Elsa_Li 发表于 2024-5-30 17:21
printf打印的值与实际变量值不同
![5c955462d2cfabd391ab955e539c202b.png](data/attachment/forum/2 ...

[md]感觉你在表达printf本身没有问题,只是偶尔丢数据。

那就要检查程序逻辑了。

Elsa_Li 回答时间:2024-5-31 09:20:56

xmshao 发表于 2024-5-30 21:42
感觉你在表达printf本身没有问题,只是偶尔丢数据。</p>
<p>那就要检查程序逻辑了。

[md]我给的是实数,局部变量,固定了浮点数的值,也是有这个情况。所以我怀疑是printf的问题,我也尝试直接用TX发送,也有这个问题

芯片:STM32F103C8T6 环境:STM32CubeMX和STM32CubeIDE 库:STM32F1HAL 问题:UART1 printf打印浮点数,偶尔出现数据丢失 例子固定值读点数如 float A=25.6666;float B=24.7777; 实际打印出来: 第一种情况:A=2.0000;B=0.0000; 第二种情况:A=-2.0000; B=-26815615859885194199148049996411692254958731641184786755447122887443528060147093953603748596333806855380063716372972101707507765623893139892867298012168192.000000 偶尔会出现以上情况,除此之外正常打印浮点数。

xmshao 回答时间:2024-6-3 13:57:13

Elsa_Li 发表于 2024-5-31 09:20
我给的是实数,局部变量,固定了浮点数的值,也是有这个情况。所以我怀疑是printf的问题,我也尝试直 ...

[md]我改为定时器定时触发,在中断里做printf输出,测试几个小时一点问题都没有。

image.png

image.png

你将变量前加上volatile试试。

另外,手上有别的开发板也可以试试,或者换个串口助手看看。

Elsa_Li 回答时间:2024-6-4 10:19:15

xmshao 发表于 2024-6-3 13:57
我改为定时器定时触发,在中断里做printf输出,测试几个小时一点问题都没有。</p>
<p>![image.png](data/at ...

[md]好的,我试试,真的奇怪,我感觉不是这个问题

Glenxu 回答时间:2024-6-6 21:09:30

浮点一定会有“有小数”的限制,也就是第6位以后会有数据不准确

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版