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

Arduino中PROGMEM存储的char数组读取异常问题求助

Arduino PROGMEM字符数组读取问题解决办法

问题出在哪

PROGMEM 存储的内容在Flash程序存储器中,而非Arduino默认访问的SRAM。硬编码索引(如myCharArray[2])能正常工作,是因为编译器编译阶段会直接把Flash中对应位置的字符提取出来嵌入代码;但用变量作为索引时,程序运行阶段无法通过普通数组语法直接访问Flash,必须使用专门的PROGMEM读取函数。

正确写法

1. 头文件中正确声明PROGMEM数组

确保头文件里的数组声明符合规范:

// myCommand.h
#include <avr/pgmspace.h> // 必须包含这个头文件,否则无法操作PROGMEM

const char myCharArray[] PROGMEM = "你的目标字符内容";

2. 循环中使用专用函数读取

不要直接用myCharArray[i],改用pgm_read_byte()读取单个字符:

// 主程序示例
#include "myCommand.h"

void setup() {
  Serial.begin(9600);
  // 注意:用strlen_P获取PROGMEM字符串长度,不能用普通的strlen
  int strLength = strlen_P(myCharArray);

  for (int i = 0; i < strLength; i++) {
    // 传递数组地址+索引,读取Flash中对应位置的字符
    char currentChar = pgm_read_byte(&myCharArray[i]);
    Serial.print(currentChar);
  }
}

void loop() {}

关键注意事项

  • 无论头文件还是主程序,都必须包含<avr/pgmspace.h>,这是AVR架构下操作PROGMEM的核心依赖。
  • 获取PROGMEM字符串长度必须用strlen_P(),普通strlen()会从SRAM读取,结果必然错误。
  • 如果存储的是其他类型数据,对应使用不同的读取函数:16位数据用pgm_read_word(),32位数据用pgm_read_dword()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 10:03:16