Arduino PROGMEM字节数组

3
考虑以下使用Arduino IDE编译的代码片段:
PROGMEM  char charSet[]  = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xA , 0x6, 0xE, 0x1, 0x9,0x5, 0xD, 0x3,0xB,0x7,0xF };
char reversed[]          = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xA , 0x6, 0xE, 0x1, 0x9,0x5, 0xD, 0x3,0xB,0x7,0xF };
char ff;

for (int i=0; i < 16; i++) {
    Serial.print(" ");
    Serial.print(reversed[i], HEX);
}

Serial.println(" ");
for (int i=0; i < 16; i++) {
    Serial.print(" ");
    ff = pgm_read_byte(&charSet[i]);
    Serial.print(ff);
}

我预期这两个for循环会产生相同的输出。但实际输出为:

  0 8 4 C 2 A 6 E 1 9 5 D 3 B 7 F
  FFFFFF94 FFFFFFB0 6 FFFFFF80 FFFFFF91 FFFFFFC7 3 62 FFFFFFE3 E FFFFFF94 5E 29 FFFFFF99 23 39

我错过了什么?

4个回答

4

是的,缺少 const 关键字。

也许使用 prog_char 不是一个好主意,因为它在 gcc-avr 中被标记为已弃用,请参见 avr/pgmspace.h


1

好的,答案是使用 PROGMEM 声明。我必须将其从函数中移出,并添加 const 关键字。其他更改,如数据类型,无法正常工作。

完整的答案在 Arduino 论坛 上。


0

您使用了错误的数据类型。请参考http://arduino.cc/en/Reference/PROGMEM

有些晦涩的错误是由于在程序内存调用时使用了普通的数据类型。

您不能使用 char,而必须使用 prog_char

因此:

PROGMEM prog_char charSet[] = {0x0, 0xB}

那应该可以工作。

顺便说一下:您不必执行Serial.println(" ");,您只需执行Serial.println();


0
PROGMEM  char charSet[] = ...

这不太好——对于 PROGMEM 数据,您不能使用普通的内存类型。您应该做的是

PROGMEM  prog_char charSet[] = ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接