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

为什么Arduino的Serial.print函数无法打印完整字符串?

问题根因
  • 核心故障点在appendCharBuffer函数的追加逻辑:for (int i = 0; i<=strlen(message); i++) 会将每个传入子串末尾的\0(C语言字符串结束符)一同写入charBuffer。
  • 第一次调用appendCharBuffer("1st line ")时,子串的结束符会被写入charBuffer[9]的位置,后续两次追加操作从bufferIndex=10的位置开始写入,不会覆盖这个提前存在的结束符。
  • Serial.println(charBuffer)遵循C语言字符串的打印规则:从数组首地址开始读取,遇到第一个\0就终止输出,因此只会输出到charBuffer[8]的空格位置,最终打印结果为1st line 。
  • 你使用for循环逐个打印前22个字符时,直接输出每个位置的字符值,忽略了\0的终止语义,因此可以输出完整的拼接内容。
修复方案

修改appendCharBuffer的循环逻辑,仅拷贝子串的有效字符,不要拷贝每个子串自带的结束符:

  1. 将循环条件从i<=strlen(message)修改为i < strlen(message),仅拷贝非结束符的有效内容
  2. 根据你的使用场景补充全局结束符:
    • 如果需要buffer随时可以作为合法字符串使用,每次追加完有效字符后,在当前bufferIndex位置写入\0,不移动bufferIndex的数值,下次追加时会直接覆盖这个临时结束符
    • 如果仅在打印/存文件前需要合法字符串,在调用对应操作前手动在当前bufferIndex位置写入\0即可

修复后的参考代码

char charBuffer[1024];

void setup() {
 Serial.begin(115200);
}

void loop() {
  appendCharBuffer("1st line ");
  appendCharBuffer("hello ");
  appendCharBuffer("world ");

  for(int i = 0; i<=21; i++)
  {
    Serial.print(charBuffer[i]);
  }
  Serial.println("");
  Serial.println(charBuffer);
  while(1){}
}

void appendCharBuffer(const char * message)
{
  static int bufferIndex = 0;
  if (bufferIndex >= 950)
  {
    // 存文件前补结束符
    charBuffer[bufferIndex] = '\0';
    appendFile(charBuffer);
    bufferIndex = 0;
  }

  // 仅拷贝有效字符,不拷贝子串结束符
  for (int i = 0; i < strlen(message); i++)
  {
    charBuffer[bufferIndex] = message[i];
    bufferIndex++;
  }
  // 补临时结束符,保证buffer随时可作为字符串使用
  charBuffer[bufferIndex] = '\0';
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:27:04