编辑:该问题仅出现在STM32 CubeIDE上,在Keil-MDK上正常工作。
我一直尝试使用STM32 F411 MCU的USART端口发送消息。我编写了一个函数,以char*
和省略号作为输入。理想情况下,您将数字转换为字符串/字符,并放入char
缓冲区,然后一次发送一个字符到USART-〉DR。函数如下:
void Serial::write_byte(int data)
{
Serial::port->DR = (data & 0xff);
while (!(Serial::port->SR & (1 << 7))); //wait for Tx buff to get empty
}
void Serial::write(char *msg, ...)
{
char buff[256];
va_list args;
va_start(args, msg);
vsprintf(buff, msg, args);
for (unsigned int i = 0; i < strlen(buff); i++)
{
Serial::write_byte(buff[i]);
}
}
上面的函数可以处理整数和字符。但是当我执行以下操作时:
float R = (int16_t(raw[0] << 8 | raw[1]))/4096.0;
Debug.write("XG : %f\n",R);
串行端子上的输出为:XG :
(无编号)
注意,我尝试了C & C++中可用的各种方法:
1.使用 sprintf
int16_t R = int16_t(raw[0] << 8 | raw[1]);
char str[10];
sprintf(str,"%f",(R/4096.0));
Debug.write("XG : %s\n",str);
输出为:XG : 0
,即使使用%.4f
,也显示0。
1.使用 *std::字符串 *
int16_t R = int16_t(raw[0] << 8 | raw[1]);
// goes into unknow state , mcu stops
std::string msg = "Roll : " + std::to_string(R/4096.0) + "\n";
Debug.write_string(msg);
sleep_ms(1000);
在这种情况下没有输出。我检查了调试器,这是它卡住的地方:
除了代码外,我还更改了STM32 CubeIDE中的FPU设置,以下是当前设置:
到目前为止,我提到了各种SO问题和教程,但它从来没有为我工作。
我将感谢您的帮助和指导!
1条答案
按热度按时间k5ifujac1#
好吧,从所有可用的QA和所有挖掘问题,我发现暗示的设置不适合我,我的代码在实现中没有问题!注意,这不是Keil MDK上的问题,它只在STM32 CubeIDE上。
因此,对于那些在STM32 CubeIDE中使用
float
时可能会遇到类似问题的人来说,有些论坛建议添加链接器标记-u _printf_float
,有些论坛建议更改链接器文件中的_estack
值(其中建议结束地址为2001 ffffH,但应该是20020000 H),不幸的是,这些论坛都不适合我。对我起作用的是改变MCU设置;在这里我将 * 浮点ABI* 更改为 * 软件实现 *,并检查了 * 在printf中使用浮点 *(如果您使用newlib-nano,对于标准C/C++,它将被禁用)。