考虑使用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
我错过了什么?
答案 0 :(得分:4)
是的,const
关键字丢失了。
使用prog_char
可能不是一个好主意,因为它在gcc-avr中标记为已弃用,请参阅avr/pgmspace.h
答案 1 :(得分:1)
答案是PROGMEM声明。我必须将其从功能中移出,添加const
关键字。作为数据类型的其他更改无效。
完整答案在Arduino forum。
答案 2 :(得分:0)
您的数据类型错误。来自http://arduino.cc/en/Reference/PROGMEM:
通过使用普通数据类型进行程序存储器调用,可以生成一些神秘的错误。
您无法使用char
- 您必须使用prog_char
所以:
PROGMEM prog_char charSet[] = {0x0, 0xB}
这应该有效。
顺便说一下:你不必Serial.println(" ");
你可以做Serial.println();
答案 3 :(得分:0)
PROGMEM char charSet[] = ...
这不好 - 对于PROGMEM数据,您不能使用普通的内存类型。你应该做的是
PROGMEM prog_char charSet[] = ...