为什么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的循环逻辑,仅拷贝子串的有效字符,不要拷贝每个子串自带的结束符:
- 将循环条件从
i<=strlen(message)修改为i < strlen(message),仅拷贝非结束符的有效内容 - 根据你的使用场景补充全局结束符:
- 如果需要buffer随时可以作为合法字符串使用,每次追加完有效字符后,在当前
bufferIndex位置写入\0,不移动bufferIndex的数值,下次追加时会直接覆盖这个临时结束符 - 如果仅在打印/存文件前需要合法字符串,在调用对应操作前手动在当前
bufferIndex位置写入\0即可
- 如果需要buffer随时可以作为合法字符串使用,每次追加完有效字符后,在当前
修复后的参考代码
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
相关产品推荐
相关产品推荐

