Arduino中如何将PROGMEM存储的字符串传入函数并实现对比打印
解决Arduino中PROGMEM字符串对比打印的问题
嘿,我懂你的困扰——PROGMEM字符串存在程序闪存里,没法像普通RAM字符串那样直接对比,得用专门的方法处理。我给你整理了一套完全符合需求的实现方案:
核心思路
- PROGMEM字符串存储在闪存而非RAM,不能用普通的
==或strcmp比较,必须用AVR库提供的strcmp_P函数读取闪存内容做对比。 - 用一个全局变量保存上次传入的PROGMEM字符串指针,记录历史值。
- 处理初始状态:第一次调用函数时直接打印并初始化历史记录。
完整代码实现
#include <avr/pgmspace.h> // 全局变量:保存上次传入的PROGMEM字符串指针,初始为nullptr表示无历史记录 const char* lastPrintedText = nullptr; void Demoprint(const char* newText) { // 第一次调用的情况:直接打印并更新历史指针 if (lastPrintedText == nullptr) { Serial.print(newText); lastPrintedText = newText; return; } // 对比新字符串和历史字符串(PROGMEM专用比较函数) // strcmp_P返回0表示两个字符串完全相同,非0则不同 if (strcmp_P(lastPrintedText, newText) != 0) { Serial.print(newText); lastPrintedText = newText; } } void setup() { Serial.begin(9600); while (!Serial); // 等待串口连接(适用于Uno、Nano等需要手动打开串口的板子) // 测试调用 Demoprint(F("new command")); // 第一次调用,会打印 Demoprint(F("new command")); // 和上次内容相同,不打印 Demoprint(F("another command")); // 内容不同,会打印 Demoprint(F("new command")); // 又变回之前的内容,会打印 } void loop() { // 这里可以添加你的循环逻辑 }
关键细节解释
strcmp_P函数:这是AVR库专门为PROGMEM字符串设计的比较函数,它会从闪存中读取字符串内容逐字符对比,返回值和普通strcmp一致:0表示相等,非0表示不等。F()宏的本质:F("字符串")等价于(const char*)PSTR("字符串"),它把字符串存入程序闪存,返回指向闪存的指针,所以函数参数用const char*就能接收。- 全局变量的作用:
lastPrintedText保存的是指向PROGMEM字符串的指针(指针本身存在RAM里),用来记录上次打印的内容,每次调用都能快速对比。 - 长度适配:不管字符串长度怎么变,
strcmp_P都会自动以null终止符为结束标志进行对比,完全适配可变长度的需求。
内容的提问来源于stack exchange,提问作者Ltetzner
相关产品推荐
相关产品推荐

