c++ 如何将浮点数发送到USART数据寄存器(ARM-M4)?

8yoxcaq7  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(116)

编辑:该问题仅出现在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问题和教程,但它从来没有为我工作。
我将感谢您的帮助和指导!

k5ifujac

k5ifujac1#

好吧,从所有可用的QA和所有挖掘问题,我发现暗示的设置不适合我,我的代码在实现中没有问题!注意,这不是Keil MDK上的问题,它只在STM32 CubeIDE上。
因此,对于那些在STM32 CubeIDE中使用float时可能会遇到类似问题的人来说,有些论坛建议添加链接器标记-u _printf_float,有些论坛建议更改链接器文件中的_estack值(其中建议结束地址为2001 ffffH,但应该是20020000 H),不幸的是,这些论坛都不适合我。
对我起作用的是改变MCU设置;在这里我将 * 浮点ABI* 更改为 * 软件实现 *,并检查了 * 在printf中使用浮点 *(如果您使用newlib-nano,对于标准C/C++,它将被禁用)。

相关问题