你可能發(fā)現(xiàn)了,使用Arduino提供的EEPROM API,只能將字節(jié)型的數(shù)據(jù)的存入EEPROM。如果要存儲(chǔ)字節(jié)以外的數(shù)據(jù)類(lèi)型,又需要怎么做呢?
一個(gè)float類(lèi)型的數(shù)據(jù),需要占用4個(gè)字節(jié)的存儲(chǔ)空間。因此我們可以把一個(gè)float拆分為4個(gè)字節(jié),然后逐字節(jié)的寫(xiě)入EEPROM,來(lái)達(dá)到保存float數(shù)據(jù)的目的。
這里我們使用共用體,把float數(shù)據(jù)拆分為4個(gè)字節(jié)。
共用體:幾個(gè)不同的變量共同占用一段內(nèi)存的結(jié)構(gòu),在C語(yǔ)言中,被稱(chēng)作共用體類(lèi)型結(jié)構(gòu),簡(jiǎn)稱(chēng)共用體。
首先定義一個(gè)名為data的共用體結(jié)構(gòu),共用體中有兩個(gè)類(lèi)型不同的成員變量:
再申明一個(gè)data類(lèi)型的變量col:
現(xiàn)在你可以通過(guò)col.a訪(fǎng)問(wèn)這個(gè)共用體中的float類(lèi)型成員a,通過(guò)col.b訪(fǎng)問(wèn)這個(gè)共用體中的byte類(lèi)型成員b。col.a和col.b共同占用四個(gè)字節(jié)的地址。給col.a賦值后,通過(guò)col.b即可拆分float的目的。
這里我們提供一個(gè)將float類(lèi)型存入EEPROM的例程。
[mw_shl_code=cpp,true]/*
OpenJumper Examples
寫(xiě)入float類(lèi)型到EEPROM
奈何col 2013.2.2
www.openjumper.com
*/
#include <EEPROM.h>
union data
{
float a;
byte b[4];
};
data col;
int addr = 0;
int led = 13;
void setup()
{
col.a=987.65;
for(int n=0;n<4;n++)
EEPROM.write(n, col.b[n]);
pinMode(led, OUTPUT);
}
void loop()
{
//LED閃爍,提示任務(wù)已完成
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
[/mw_shl_code]
讀出儲(chǔ)存在EEPROM中的float類(lèi)型數(shù)據(jù)思路和寫(xiě)入時(shí)相同,完整代碼如下:
[mw_shl_code=arduino,true]/*
OpenJumper Examples
從EEPROM讀出float類(lèi)型
奈何col 2013.2.2
www.openjumper.com
*/
#include <EEPROM.h>
union data
{
float a;
byte b[4];
};
data c;
int addr = 0;
int led = 13;
void setup(){
for(int n=0;n<4;n++)
c.b[n]=EEPROM.read(n);
Serial.begin(9600);
}
void loop(){
//輸出
Serial.println(c.a);
delay(1000);
}[/mw_shl_code]
[mw_shl_code=arduino,true]/*
OpenJumper Examples
從EEPROM讀出float類(lèi)型
奈何col 2013.2.2
www.openjumper.com
*/
#include <EEPROM.h>
union data
{
float a;
byte b[4];
};
data c;
int addr = 0;
int led = 13;
void setup(){
for(int n=0;n<4;n++)
c.b[n]=EEPROM.read(n);
Serial.begin(9600);
}
void loop(){
//輸出
Serial.println(c.a);
delay(1000);
}[/mw_shl_code]
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭(zhēng)議評(píng)論。
參與本評(píng)論即表明您已經(jīng)閱讀并接受
上述條款。