STM32
直播中

风来吴山

8年用户 1462经验值
擅长:电源/新能源
私信 关注
[问答]

在macos下SW4STM32编译,调用printf异常怎么解决?

刚开始在MACOS下开发STM32的程序,现在出现了一些很奇怪的问题,看是否大家有遇到这样的问题。
开发配置如下
1.STM32cube427,STM32Cube FW_F4 V1.21.0
       2.Version: Neon.3 Release (4.6.3)  Build id: 20170314-1500

在while(1)中的源代码
void TASK(void){
      double b = 2.2f;
      HAL_UART_Transmit( huart1,(uint8_t *)”matlab_uartrn”,13,0xffff);
      printf(“MATLAB_UARTrn”);
      printf(“%d,”,123);
      printf(“1+1=%.2frn”,b);
     while(1){
        LED_Flash();
        HAL_Delay(200);
        printf(“%.2f,”,1.1);
      }
}

程序一运行就能够在串口收到以下的信息:
matlab_uart
      MATLAB_UART
     123,1+1=2.20

但出当运行到while(1)里面的语句时候会出现,LED指示能够在200ms的时候闪烁一次,而printf函数没有正确输出数据。
在while(1)函数运行几分钟以后,串口能够一次收到一大串的的字符串
1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10
程序没有死机,就是都要等等几分钟才能够接收到一次串口发过来的一大串字符。

有谁能够解决一下这样的问题吗?


解决办法:1.在程序中禁止printf的缓冲机制:setbuf(stdout, NULL);
2.在printf语句后面加上更新缓冲区语句:fflush(stdout);

回帖(1)

田爽

2024-4-17 16:36:48
printf 内部有缓冲机制的,一般来说是碰到一个换行符清理一次内部缓冲区。你这样属于长期不输出换行符,如果需要及时输出,要么需要手工清缓冲区,要么需要禁掉输出缓冲区。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分