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 回答 4

4

是的,const缺少关键字。

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

于 2012-08-30T20:07:11.457 回答
1

答案就是 PROGMEM 声明。我不得不将它从函数中移出,添加const关键字。作为数据类型的其他更改不起作用。

完整的答案在Arduino 论坛上

于 2012-08-30T07:50:53.323 回答
0

你有错误的数据类型。从http://arduino.cc/en/Reference/PROGMEM

使用普通数据类型进行程序内存调用会产生一些神秘的错误。

你不能使用char——你必须使用prog_char

所以:

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

那应该行得通。

顺便说一句:你不必做Serial.println(" "); 你可以做Serial.println();

于 2012-08-29T20:20:32.800 回答
0
PROGMEM  char charSet[] = ...

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

PROGMEM  prog_char charSet[] = ...
于 2012-08-29T20:23:26.103 回答