ESP32S2基于ESP-IDF使用fgets()读取串口输入无法等待输入的问题
ESP32S2中fgets()不等待用户输入直接返回的解决方法
在ESP-IDF环境下,标准输入(stdin)默认启用了缓冲机制,这会导致fgets()在没有用户输入的情况下直接读取到空内容返回。要解决这个问题,只需调整stdio的缓冲模式,确保输入操作是阻塞式的。
解决步骤
- 在
app_main()开头添加代码禁用stdin的缓冲,强制fgets()等待用户输入:setvbuf(stdin, NULL, _IONBF, 0); - 确保串口监控工具的波特率与ESP-IDF配置一致(默认是115200),避免因波特率不匹配导致的异常输入。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> void app_main(void) { // 禁用标准输入缓冲,让fgets()阻塞等待用户输入 setvbuf(stdin, NULL, _IONBF, 0); char command[64] = {}; printf("Welcome!\n"); // 现在会等待用户输入并按下回车 fgets(command, sizeof(command), stdin); printf("command: %s\n", command); }
额外说明
如果你之前尝试的getchar()循环无效,本质是因为stdin缓冲中可能残留了空数据或EOF标志,禁用缓冲后,输入会直接被实时读取,不会提前触发返回。如果问题仍存在,可以检查ESP-IDF的menuconfig配置:进入Component config → ESP System Settings → Standard input/output configuration,确认串口端口、波特率等参数与实际使用的监控工具匹配。
内容的提问来源于stack exchange,提问作者Radiofreak1041
相关产品推荐
相关产品推荐

