[STM32L1] int64_t值的结果错误。

[复制链接]
梧桐uuu 发表于 2025-8-22 08:30 | 显示全部楼层 |阅读模式
在使用STM32CubeIDE v1.5.0时,打印int64_t值的结果错误。
使用sprintf来显示一些值以进行调试。得到了错误的结果,但在线GCC编译器中可以正常工作。

代码位于一个函数中,目前为了调试,我在函数内部重新赋值。以下是STM32CubeIDE中的代码:
void log_data(int16_t u, int16_t y, int64_t z, int16_t indx )
{
        u = 50;
        y= 100;
        z= 4351234;
        indx= 0;

        static char msg[48];
        sprintf(msg, "%d %d %lld %d \r\n>", u, y, z, indx);

        HAL_UART_Transmit_IT(&huart3, (uint8_t *) msg, strlen(msg)); // &huart3 &hlpuart1
}

打印结果为50 100 ld 4351234

在在线GCC编译器中运行此程序时:
// Online C compiler to run C program online
#include <stdio.h>

#define int16_t __int16_t
#define int64_t __int64_t
int main() {
    // Write C code here
    int16_t u = 50;
    int16_t y = 100;
    int64_t z = 4351234;
    int16_t indx = 0;
   
    static char msg[48];
    sprintf(msg, "%d %d %lld %d \r\n>", u, y, z, indx);
    printf("Hello world %s" , msg);
   
    return 0;

}


显示结果为:Hello world 50 100 4351234 0  符合预期。


需注意:STM32CubeIDE代码输出的第三位显示为字符'ld',且末位值(indx)本应为0却未显示。



若将z改为9876543210,在线编译器能正确输出结果,但STM32CubeIDE却显示:50 100 ld 1286608618

公羊子丹 发表于 2025-8-26 07:32 | 显示全部楼层
最保险的还是让 CubeIDE 自动生成结构,别自己硬建 Includes,否则后面维护很痛苦
周半梅 发表于 2025-8-26 07:32 | 显示全部楼层
好像是格式化符的问题,STM32 的 newlib 里 %lld 支持不完整,可以试试 %lld 改成 %lld 并打开 nano printf 选项看看。
帛灿灿 发表于 2025-8-26 07:33 | 显示全部楼层
你确认下工程里有没有启用 nano.specs?那个版本的 sprintf 对 long long 处理不完整。
童雨竹 发表于 2025-8-26 07:34 | 显示全部楼层
建议换 snprintf 而不是 sprintf,避免数组越界,顺便看看会不会改善。
万图 发表于 2025-8-26 07:35 | 显示全部楼层
看起来 indx 没输出,可能是因为前面的格式化出错,导致后面的参数解析错位。
Wordsworth 发表于 2025-8-26 07:36 | 显示全部楼层
你可以试试把 z 定义成 long long 而不是 int64_t,看结果会不会不一样。
Bblythe 发表于 2025-8-26 07:38 | 显示全部楼层
STM32CubeIDE v1.5.0 太老了,升级下试试,新版对 long long 支持好一些。
Pulitzer 发表于 2025-8-26 07:39 | 显示全部楼层
我一般在嵌入式里用 sprintf("%ld", (long)z) 分两次打印高低 32 位,不直接用 %lld。
Uriah 发表于 2025-8-26 07:40 | 显示全部楼层
还有一种可能是编译器优化问题,你加上 volatile 再试试。
Clyde011 发表于 2025-8-26 07:41 | 显示全部楼层
在线 GCC 正常是因为它用的是完整的 libc,STM32 工程默认用的是精简版库,所以表现不一样。
周半梅 发表于 2025-8-26 07:41 | 显示全部楼层
我之前在 L1 上也遇到过,最后用 printf("%" PRId64, z); 就正常了,要加上 inttypes.h。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

44

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部