向24C02芯片中寫(xiě)入浮點(diǎn)數(shù)的方法,測(cè)試可用!
方法:用共用體
(1)共用體類(lèi)型定義
#define FLOAT_BYTE_NUM 4 //float類(lèi)型占用字節(jié)數(shù)
//浮點(diǎn)數(shù)存儲(chǔ)共用體
typedef union
{
float value;
uint8_t byte[FLOAT_BYTE_NUM];
} storFloatData;
(2)函數(shù)定義
/********************************************************************************************************
函數(shù)名稱(chēng):
函數(shù)功能:向指定地址寫(xiě)入1個(gè)浮點(diǎn)數(shù)
詳 述:
輸 入:
*********************************************************************************************************/
void Storage_WriteFloatNum( uint16_t addr, storFloatData data )
{
uint8_t i = 0;
uint8_t a = 0;
for( i = 0; i <= FLOAT_BYTE_NUM - 1; i++ )
{
AT24CXX_WriteOneByte( addr + i, data.byte[ i] );
}
return;
}
/********************************************************************************************************
函數(shù)名稱(chēng):
函數(shù)功能:從指定地址讀出1個(gè)浮點(diǎn)數(shù)
詳 述:
輸 入:
*********************************************************************************************************/
storFloatData Storage_ReadFloatNum( uint16_t addr )
{
uint8_t i = 0;
storFloatData read_data;
for( i = 0; i <= FLOAT_BYTE_NUM - 1; i++ )
{
read_data.byte[ i] = AT24CXX_ReadOneByte( addr + i );
}
return read_data;
}
(3)使用例程
storFloatData data0={12.34};
storFloatData data1;
Storage_WriteFloatNum(0,data0);
delay_ms(20);
data1 = Storage_ReadFloatNum(0);
關(guān)于存儲(chǔ)float浮點(diǎn)數(shù)到flash或eeprom中的方法
float 單精度浮點(diǎn)數(shù)占用32bit空間,不像存儲(chǔ)整型或char型數(shù)據(jù)那么便捷,我們?cè)诖鎯?chǔ)float數(shù)據(jù)時(shí)就需要先將float數(shù)變換一下,變換成數(shù)組的格式,這樣就方便存儲(chǔ)和讀取了,具體實(shí)現(xiàn)有以下方法:
第一種存儲(chǔ)方式(取地址法):
uint8_t datatmp[4]; //定義數(shù)組 因?yàn)閒loat數(shù)據(jù) 占4個(gè)字節(jié)
float s; //這是要存儲(chǔ)的浮點(diǎn)數(shù)
uint8_t *p; //定義一個(gè)u8指針變量
p=(uint8_t*)&s; //取浮點(diǎn)數(shù)的地址
memcpy(datatmp,p,4); //拷貝浮點(diǎn)數(shù)地址4個(gè)字節(jié)到數(shù)組
這種方式就是用取地址的方式,然后又知道浮點(diǎn)數(shù)占用的空間,這樣就可以通過(guò)拷貝即可將浮點(diǎn)數(shù)轉(zhuǎn)移到數(shù)組中。第二種存儲(chǔ)方式(利用共用體):
Union
{
float x;
uchar s[4];
}F32_Sep;
然后把a(bǔ)的值賦給F32_Sep.x,這樣一來(lái)其實(shí)s[0]對(duì)應(yīng)了浮點(diǎn)數(shù)的最高位,s[3]對(duì)應(yīng)其最低位,因此,保存到EEPROM中只需將s[0]~s[3]即可。
這就是利用了共用體共用一段內(nèi)存的原理,即 float x 和 uchar s[4],使用的是一個(gè)空間大小的內(nèi)存。
將單個(gè)字節(jié)數(shù)據(jù)讀取到一個(gè)float類(lèi)型的數(shù)據(jù)中---的幾種方法
從串口讀取傳感器值的時(shí)候總是一個(gè)一個(gè)字節(jié),高八位低八位,需要拼接成一個(gè)float或者int的時(shí)候,這些方法有用處
1、聯(lián)合體方式
union
{
float f;
unsigned char x[4];
} data;
data.x[0] = 0xA2;
data.x[1] = 0xA1;
data.x[2] = 0xB2;
data.x[3] = 0xB1;
return data.f;
2、移位
float result;
result=(0xA2<<24)|(0xA1<<16)|(0xB2<<8)|0xB1;
3、不知道怎么命名
float result;
*(char*)&result = 0xA2;
*((char*)&result + 1) = 0xA1;
*((char*)&result + 2) = 0xB2;
*((char*)&result + 3) = 0xB1;
4、數(shù)組強(qiáng)制轉(zhuǎn)換
unsigned char b[4]={0xA2,0xA1,0xB2,0xB1};
float result;
result=*((float *)b);
【必讀】版權(quán)免責(zé)聲明
1、本主題所有言論和內(nèi)容純屬會(huì)員個(gè)人意見(jiàn),與本論壇立場(chǎng)無(wú)關(guān)。2、本站對(duì)所發(fā)內(nèi)容真實(shí)性、客觀性、可用性不做任何保證也不負(fù)任何責(zé)任,網(wǎng)友之間僅出于學(xué)習(xí)目的進(jìn)行交流。3、對(duì)提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請(qǐng)勿將該數(shù)字內(nèi)容進(jìn)行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學(xué)習(xí)所提供,使用后發(fā)生的一切問(wèn)題與本站無(wú)關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準(zhǔn)確性、安全性和完整性;同時(shí)本網(wǎng)站也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來(lái),僅供學(xué)習(xí)用途使用,請(qǐng)務(wù)必下載后兩小時(shí)內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請(qǐng)及時(shí)聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|