本文介绍了指针的一个使用技巧,可以通过此方法将单片机中的变量按字节保存到EEPROM中,也可以从EEPROM中还原一个多字节的整型数或者浮点数。
在内存中变量对整数类型,包括
char, unsigned char, int, unsigned int, long, unsigned long
多于一个字节的按低字节在前,高字节在后的顺序存储的,比如
int iv = 0x1234,则在内存中的存储顺序,从地址由低到高的顺序排列,其值分别为: 34 12
long lv = 0x11223344则在内存中的顺序为: 44 33 22 11
如果想修改一个整型数的某个字节,则可以运用指针直接进行操作如下所示:
unsigned char *puc;
int i;
long lv = 0x11223344;
unsigned char temp[4]={0,0,0,0};
*puc = (unsigned char*)(&lv);
for(i=0; i{
temp = *(puc+i);
}
运行后temp中的值则为temp[]={0x44, 0x33,0x22,0x11};
如果要修改一个数的值也可以直接用以上方法把赋值前后的操作数对调一下即可
*(puc+i) = temp;
即可通过*puc将temp中的单字节数转换为一个长整型数赋给 lv
这种操作方法对数据的存储很有用,可以通过指针将长整型的数分别一个字节一个字节地写到文件中,读的时候按照同样的顺序再从文件中读到内存。当然在PC上也可以直接将长整型的数写到文件中,而在单片机中则只能一个字节一个字节地将数据写入到EEPROM中,通过这种指针操作就可以写到EEPROM中,或者读出整型或者浮点型数。以下为在ICCAVR中将数据写入到EEPROM和读出的程序。
void EEPROMWriteLong( int addr, // address in EEPROM
long dsrc) // source data
{
unsigned char *puc;
puc = (unsigned char*)(&dsrc);
EEPROMWriteBytes(addr, (void*)puc, sizeof(long));
}
long EEPROMReadLong( int addr)
{
long res;
unsigned char *puc = (unsigned char*)(&res);
EEPROMReadBytes(addr, (void*)puc, sizeof(long));
return res;
}
指针真是一个好东东,用好了就像一把无坚不摧锐利无比的长矛,但是用不好了可是会扎自己哦,这就是C的精华之民在吧!