C 如何使用PROGMEM在Arduino闪存中存储字节数组?
大家好,我是Arduino世界的新手,在Arduino RAM中存储临时值时遇到问题,所以我想我应该使用PROGMEM将它们存储在闪存中。 我试图存储2字节数组,但无法在存储后显示它们。经过一些测试后,我也不能让串行打印正常工作,但如果同时有人能更好地解释程序,那将是有帮助的。到目前为止,我的代码是:C 如何使用PROGMEM在Arduino闪存中存储字节数组?,c,arrays,flash,arduino,byte,C,Arrays,Flash,Arduino,Byte,大家好,我是Arduino世界的新手,在Arduino RAM中存储临时值时遇到问题,所以我想我应该使用PROGMEM将它们存储在闪存中。 我试图存储2字节数组,但无法在存储后显示它们。经过一些测试后,我也不能让串行打印正常工作,但如果同时有人能更好地解释程序,那将是有帮助的。到目前为止,我的代码是: #include <avr/pgmspace.h> struct GRID{ boolean isOn; uint16_t color; uint8_t X; uint
#include <avr/pgmspace.h>
struct GRID{
boolean isOn;
uint16_t color;
uint8_t X;
uint8_t Y;
};
GRID landed[10][22];
GRID falling[22][10];
//PROGMEM prog_uint8_t xAxis[] = {1,2,3,4,5,6,7,8,9,10};
//PROGMEM prog_uint8_t yAxis[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};
uint8_t xAxis[] = {1,2,3,4,5,6,7,8,9,10};
uint8_t yAxis[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};
void iniLanded(){
for(int i = 0; i < 10; i++)
for(int j = 0; j < 22; j++){
landed[i][j].color=0x0000;
landed[i][j].X = xAxis[i];
landed[i][j].Y = yAxis[j];
}
}
void iniFalling(){
for(int i = 0; i < 22; i++)
for(int j = 0; j < 10; j++){
falling[i][j].color=0x0000;
falling[i][j].X = xAxis[j];
falling[i][j].Y = yAxis[i];
}
}
void printLanded(){
for(int i = 0; i < 10; i++)
for(int j = 0; j < 22; j++){
Serial.print(landed[i][j].X); Serial.print(" "); Serial.println(landed[i][j].Y);
}
}
void printFalling(){
for(int i = 0; i < 22; i++)
for(int j = 0; j < 10; j++){
Serial.print(landed[i][j].X); Serial.print(" "); Serial.println(landed[i][j].Y);
}
}
void setup(){
Serial.begin(9600);
iniLanded();
iniFalling();
}
void loop(){
Serial.println(F("Hello World!"));
delay(100);
/*printLanded();
delay(100);
printFalling();
delay(100);*/
}
#包括
结构网格{
布尔伊森;
uint16_t颜色;
uint8_t X;
uint8_t Y;
};
[10][22];;
网格下降[22][10];
//PROGMEM prog_uint8_t xAxis[]={1,2,3,4,5,6,7,8,9,10};
//PROGMEM prog_uint8_t yAxis[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};
uint8_t xAxis[]={1,2,3,4,5,6,7,8,9,10};
uint8_t yAxis[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};
无效(){
对于(int i=0;i<10;i++)
对于(int j=0;j<22;j++){
着陆[i][j]。颜色=0x0000;
着陆[i][j].X=xAxis[i];
着陆[i][j].Y=yAxis[j];
}
}
空位(){
对于(int i=0;i<22;i++)
对于(int j=0;j<10;j++){
下降[i][j]。颜色=0x0000;
下降[i][j].X=xAxis[j];
下降[i][j].Y=yAxis[i];
}
}
void printLanded(){
对于(int i=0;i<10;i++)
对于(int j=0;j<22;j++){
Serial.print(landed[i][j].X);Serial.print(“”);Serial.println(landed[i][j].Y);
}
}
作废{
对于(int i=0;i<22;i++)
对于(int j=0;j<10;j++){
Serial.print(landed[i][j].X);Serial.print(“”);Serial.println(landed[i][j].Y);
}
}
无效设置(){
Serial.begin(9600);
iniLanded();
(i)下降();
}
void循环(){
Serial.println(F(“你好,世界!”);
延迟(100);
/*printLanded();
延迟(100);
打印下降();
延迟(100)*/
}
诀窍在于从flash调用的方式。请参阅我的示例,与您的注释代码非常相似。
这里是你回拨数据的地方。请注意pgm_read_word_near的用法和尊重&。其中还有其他类似的字节、字等函数。我将uint8_t xAxis更改为无符号字符xAxis[10]PROGMEM={…};当我需要使用它时,我使用pgm_read_byte(&(xAxis[i]);pgm_read_byte和pgm_read_word之间有区别吗?pgm_read_word将读取两个字节。注意,您使用的是数组。因此,pgm函数需要知道或排列数组中元素的大小。好的,我不需要使用大于256的整数,所以我认为read_byte适合我。另请注意,prog_void是如何工作的?对于那些想知道为什么没有任何东西以串行方式打印的人来说,这是因为Arduino在第二次初始化功能期间耗尽了RAM。