
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) {
// printf("T-Set:%.4f \r\n",Printf_T_Set); // printf("T-Act:%.4f \r\n",Printf_T_Act);
} } ifdef GNUCdefine PUTCHAR_PROTOTYPE int __io_putchar(int ch)elsedefine PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)endifPUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);//阻塞方式打印,串口1 return ch; } |
STM32的上电启动过程
STM32中如何实现数据加密
I2C从模式编程之STOP中断
STM32的I2S外设
STM32CubeMX生成STM32mp135D的USART1,2,3,6代码初始化是空的
四轴飞行器
为何Tim2自动装载定时的首次中断时间总是设定时间的2倍?
如何提高开发板的抗干扰能力?
STM8AF62XX+L99PM62GXP LIN通讯的电路原理图有吗?官网提供了一套软件,没找到对应的原理图,请大家指教一下
使用STM32L451CEU6型号的芯片,在用usart(PA9、PA10)进行串口通信时,发送0x55在PC端可以收到正确的数据,但是发送0x80会收到0x00的数据,发送0x01会收到0x7F的数据,串口助手的配置和CubeMX上的配置参数是一样的(都是115200,8N1),请问各位这个是什么原因呀?
有个地方的配置,别忽略了。工程属性下面\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 **
我刚才基于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
楼上说得对,还有就是把打印函数放到主函数试试、
[md]1、STM32Cube已勾选打印浮点数的设置
2、代码是可以打印浮点数的,但偶尔会出现丢数据的情况,还是没有解决 3、在线debug已确认printf前,变量数值正常,printf后,实际打印与变量数值不同

[md]printf打印的值与实际变量值不同
可以看到我其他的回复吗?谢谢
[md]感觉你在表达printf本身没有问题,只是偶尔丢数据。
那就要检查程序逻辑了。
[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 偶尔会出现以上情况,除此之外正常打印浮点数。
[md]我改为定时器定时触发,在中断里做printf输出,测试几个小时一点问题都没有。
你将变量前加上volatile试试。
另外,手上有别的开发板也可以试试,或者换个串口助手看看。
[md]好的,我试试,真的奇怪,我感觉不是这个问题
浮点一定会有“有小数”的限制,也就是第6位以后会有数据不准确