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

Arduino中如何将PROGMEM存储的字符串传入函数并实现对比打印

解决Arduino中PROGMEM字符串对比打印的问题

嘿,我懂你的困扰——PROGMEM字符串存在程序闪存里,没法像普通RAM字符串那样直接对比,得用专门的方法处理。我给你整理了一套完全符合需求的实现方案:

核心思路

  1. PROGMEM字符串存储在闪存而非RAM,不能用普通的==或strcmp比较,必须用AVR库提供的strcmp_P函数读取闪存内容做对比。
  2. 用一个全局变量保存上次传入的PROGMEM字符串指针,记录历史值。
  3. 处理初始状态:第一次调用函数时直接打印并初始化历史记录。

完整代码实现

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:33