ESP32(PlatformIO)中C++拼接字符串前半部分消失问题求助
ESP32字符串拼接前半部分丢失问题排查
问题详情
用PlatformIO开发ESP32项目,写了这段简化函数:
void request_tts(string text) { string body = "{\"text\":\"" + text + "\", \"voice_name\":\"es-US-Neural2-B\"}"; Serial.println(body.c_str()); Serial.println(ESP.getFreeHeap()); }
结果输出异常,字符串前半部分直接丢失:
", "voice_name":"es-US-Neural2-B"} 221672
试过.append()、const char*结合strcat()(还触发溢出报错)、Arduino的String类等多种拼接方式都没用,查了剩余内存充足,且两天前代码还能正常运行,到底哪出问题了?
排查方向及解决办法
传入的
text包含隐藏控制字符
如果text里混了\r(回车符),输出时光标会跳回行首,后续内容直接覆盖前半段。试试先清理text中的控制字符:void clean_string(string &s) { s.erase(remove_if(s.begin(), s.end(), [](unsigned char c) { return iscntrl(c); }), s.end()); } void request_tts(string text) { clean_string(text); string body = "{\"text\":\"" + text + "\", \"voice_name\":\"es-US-Neural2-B\"}"; Serial.println(body.c_str()); Serial.println(ESP.getFreeHeap()); }串口输出缓冲或波特率不匹配
先确认代码里的串口波特率和监视器设置一致,比如代码是Serial.begin(115200),监视器也得选115200。另外可以在打印后强制刷新缓冲:Serial.println(body.c_str()); Serial.flush(); Serial.println(ESP.getFreeHeap());换用更稳妥的格式化方式
别直接拼接字符串,用snprintf格式化更可靠,注意提前分配足够大的缓冲区:void request_tts(string text) { char buffer[256]; // 根据实际文本长度调整大小 snprintf(buffer, sizeof(buffer), "{\"text\":\"%s\", \"voice_name\":\"es-US-Neural2-B\"}", text.c_str()); Serial.println(buffer); Serial.println(ESP.getFreeHeap()); }环境配置或框架版本变更
两天前能正常运行,大概率是PlatformIO的ESP32框架更新或者依赖库变化导致。试试回退到之前的框架版本,在platformio.ini里指定版本:platform = espressif32@6.4.0
内容的提问来源于stack exchange,提问作者Joaquin
相关产品推荐
相关产品推荐

