STM32
直播中

fansz

8年用户 1217经验值
擅长:制造/封装
私信 关注
[问答]

在STM32CUBEIDE环境下printf()和scanf()为什么会运行失败呢

STM32CUBEIDE环境下printf()和scanf()为什么会运行失败呢?其解决方案是什么?

回帖(2)

金鼎

2021-12-2 10:57:20
STM32CUBEIDE 环境下printf()和scanf()运行失败的原因

问题重现

int __io_putchar(int ch)
{
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);        //发送一个字节
        return ch;
}


int __io_getchar()
{
        int ch;
        HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 0xFFFF);        //接收一个字节
        return ch;
}
在运行单片机的时候串口软件始终收不到数据,或者过了很久突然蹦出一大堆数据,
特地去stm论坛搜了一下,是缓冲区的问题

  从标准输入输出 stdin 和 stdout 获取的字符会被放在缓冲区,只有在缓冲的数据到达1kb或者遇到换行符时,缓冲区才会刷新
所以因为__io_putchar() 和 __io_getchar() 一次获取的数据太少,导致缓存不刷新。
解决方案

在每次调用while(1)函数前加入setvbuf(stdin, NULL, _IONBF, 0)和setvbuf(stdout, NULL, _IONBF, 0),这样就可以将缓冲区的大小设为0,读到一个字符就输出一个字符。

#include


int main()
{
        setvbuf(stdin, NULL, _IONBF, 0);
        setvbuf(stdout, NULL, _IONBF, 0);
        while(1)
        {
        //loop code
        }
}
这样就成功了。
举报

刘传威

2022-10-26 11:52:56
谢谢楼主的分享,真是解决了我长期以来的困惑!
举报

更多回帖

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