You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类等多种拼接方式都没用,查了剩余内存充足,且两天前代码还能正常运行,到底哪出问题了?

排查方向及解决办法

  1. 传入的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());
    }
    
  2. 串口输出缓冲或波特率不匹配
    先确认代码里的串口波特率和监视器设置一致,比如代码是Serial.begin(115200),监视器也得选115200。另外可以在打印后强制刷新缓冲:

    Serial.println(body.c_str());
    Serial.flush();
    Serial.println(ESP.getFreeHeap());
    
  3. 换用更稳妥的格式化方式
    别直接拼接字符串,用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());
    }
    
  4. 环境配置或框架版本变更
    两天前能正常运行,大概率是PlatformIO的ESP32框架更新或者依赖库变化导致。试试回退到之前的框架版本,在platformio.ini里指定版本:

    platform = espressif32@6.4.0
    

内容的提问来源于stack exchange,提问作者Joaquin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:30:20