Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用PROGMEM在Arduino闪存中存储字节数组?_C_Arrays_Flash_Arduino_Byte - Fatal编程技术网

C 如何使用PROGMEM在Arduino闪存中存储字节数组?

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

大家好,我是Arduino世界的新手,在Arduino RAM中存储临时值时遇到问题,所以我想我应该使用PROGMEM将它们存储在闪存中。 我试图存储2字节数组,但无法在存储后显示它们。经过一些测试后,我也不能让串行打印正常工作,但如果同时有人能更好地解释程序,那将是有帮助的。到目前为止,我的代码是:

#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。