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
相关产品推荐
相关产品推荐

