1. 存放指令
當你需要宣告存放指令名稱的空間。
2. 大量重覆性資料
當你有大量的重複性資料需要透過Serial、Client…等,Steam類型的物件print。
3. 查表法表格
當你需要設置一個資料量大的查表法表格。
為何使用
要解決硬體SRAM空間不足之問題,使用PROGMEM就是將這些大量資料從SRAM搬到Flash,當要使用的時候再從Flash中搬回來。 因為AVR系列的晶片SRAM大小不一,當資料大的情況,使用超過硬體的SRAM大小,此時編譯器編譯可能不會報錯,但是在使用上不代表程式運作不會發生異常。
如何使用
PROGMEM 變數修飾符是被定義在 pgmspace.h 之中,它是 AVR 架構中 pgmspace.h 函式庫眾多函式的其中之一。所以您要使用 PROGRAM 之前,必須在程式的開頭包含入這個函式庫,如下: #include
#include <avr/pgmspace.h>
const char Command_0[] PROGMEM = "*IDN?";
const char Command_1[] PROGMEM = "Start";
const char Command_2[] PROGMEM = "END";
const char* const CommandTable[] PROGMEM = {
Command_0,
Command_1,
Command_2
};
void setup() {
Serial.begin(19200);
while (!Serial);
//PGM_ReadChar demo
char yy[10];
PGM_ReadChar(yy, CommandTable[0]);
//print yy
for (int r = 0; r < strlen(yy); r++)
Serial.println(yy[r]);
//PGM_ReadChar_PT demo
PGM_ReadChar_PT(CommandTable[1]);
}
void loop()
{
}
void PGM_ReadChar(char input[], const char PGM_Arr[]) //Read PROGMEM to char[]
{
int len = strlen_P(PGM_Arr);
int Cnt;
for (Cnt = 0; Cnt < len; Cnt++)
{
input[Cnt] = pgm_read_byte_near(PGM_Arr + Cnt);
}
input[Cnt] = "\0";
}
void PGM_ReadChar_PT(const char PGM_Arr[]) //Read PROGMEM to print
{
int len = strlen_P(PGM_Arr);
char MyChar;
for (int k = 0; k < len; k++)
{
MyChar = pgm_read_byte_near(PGM_Arr + k);
Serial.print(MyChar);
}
}
Jammin' Jars Casino & Hotel - JTM Hub
回覆刪除JAMMIN JARS 나주 출장안마 CASINO & HOTEL in Las Vegas, 평택 출장안마 NV, USA offers an exceptional 성남 출장안마 experience in creating a memorable 서귀포 출장샵 experience for all. 서산 출장안마