⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数据存储.c

📁 C8051ucos源码
💻 C
字号:

#include "数据存储.h"
#include "FM24C256.H"


/*
铁电存储器中
0-1:纪录的条数
1-2: 记录没法送的起始位置
3-4: 自动发送的触发时间
10-50 服务器IP地址
〉100:纪录数据
*/
xdata unsigned char ServerIp[40];

xdata DataType DataBuf;

idata unsigned int TickCount;

//-------------------------------------------------------------------------------
//判断数据区如果的数据长度超过0xf000就清除全部数据和IP
unsigned char DataInit(void)
{
unsigned int cnt;
unsigned char i;
xdata unsigned char buf[100];

FM24C256Read(0,(unsigned char *)&cnt,2);
	if(cnt>0xf000)
	{
		for(i=0;i<100;i++)buf[i]=0;
		FM24C256Write(0,buf,100);
		return 0;
	}
return 1;
}
//-------------------------------------------------------------------------------
void AppendData(DataType *datarec)
{
unsigned int loc;//数据区的起始位置
unsigned int cnt;//数据区的记录数
unsigned char i;
unsigned char *p;
xdata unsigned char buf[100];

FM24C256Read(0,(unsigned char *)&cnt,2);
FM24C256Read(2,(unsigned char *)&loc,2);

if((cnt+1)==loc)return;
p = (unsigned char *)datarec;
	for(i=0;i<sizeof(DataType);i++)
	{
		buf[i] = *p++;
	}  
if(loc>500)loc=0;
FM24C256Write(100+cnt*sizeof(DataType),buf,sizeof(DataType));

cnt++;
if(cnt>=500)cnt=0;

FM24C256Write(0,(unsigned char *)&cnt,2);
}
//-------------------------------------------------------------------------------
unsigned int GetDataCount(void)
{
unsigned int cnt;

	FM24C256Read(0,(unsigned char *)&cnt,2);
return cnt;
}
//-------------------------------------------------------------------------------
/*
unsigned int GetDataLoc(void)
{
unsigned int loc;

	FM24C256Read(10,(unsigned char *)&loc,2);
return loc;
}
*/
//-------------------------------------------------------------------------------
unsigned char *GetDateTime(unsigned int loc)
{
	FM24C256Read((100+(loc*sizeof(DataType))),(unsigned char *)&DataBuf,sizeof(DataType));
	return DataBuf.datetime;
}
//-------------------------------------------------------------------------------
unsigned char *GetName(unsigned int loc)
{
	FM24C256Read((100+(loc*sizeof(DataType))),(unsigned char *)&DataBuf,sizeof(DataType));
	return DataBuf.name;
}
//-------------------------------------------------------------------------------
unsigned char *GetId(unsigned int loc)
{
	FM24C256Read((100+(loc*sizeof(DataType))),(unsigned char *)&DataBuf,sizeof(DataType));
 	return DataBuf.id;
}
//-------------------------------------------------------------------------------
void DataClr(void)
{
unsigned int i;
xdata unsigned char buf[100];
	for(i=0;i<100;i++)buf[i]=0;
	for(i=0;i<500;i++)
	{
		FM24C256Write(100+(i*sizeof(DataType)),buf,sizeof(DataType));
	}
	FM24C256Write(0,buf,4);
}
//-------------------------------------------------------------------------------
void SaveServerIP(void)
{

	FM24C256Write(10,ServerIp,40);
 
}
//-------------------------------------------------------------------------------
void LoadServerIP(void)
{
	FM24C256Read(10,ServerIp,40);
}
//-------------------------------------------------------------------------------
void SetAutoSendTime(unsigned int val)
{
	FM24C256Write(4,(unsigned char *)&val,2);
}
//-------------------------------------------------------------------------------
unsigned int GetAutoSendTime(void)
{
unsigned int val;
	FM24C256Read(4,(unsigned char *)&val,2);
	return val;
}
//-------------------------------------------------------------------------------
//取得发送缓存区的数量
unsigned int GetSendBufCnt(void)
{
unsigned int loc;//数据区的起始位置
unsigned int cnt;//数据区的记录数


FM24C256Read(0,(unsigned char *)&cnt,2);
FM24C256Read(2,(unsigned char *)&loc,2);

	if(cnt==loc)return 0;else return 1;	
}
//-------------------------------------------------------------------------------
//数据区起始位置增加
unsigned char  DataLocAdd(unsigned int val)
{
unsigned int loc;//数据区的起始位置
unsigned int cnt;//数据区的记录数
unsigned int num;

FM24C256Read(0,(unsigned char *)&cnt,2);
FM24C256Read(2,(unsigned char *)&loc,2);
	
	if(cnt>=loc)num=cnt-loc;
	if(loc>cnt){num=500-(loc-cnt);}
	if(num<val)return 0;//数据区的数据空了
	loc+=val;
	if(loc>500)loc=0;
FM24C256Write(2,(unsigned char *)&loc,2);
return 1;//还有要发的数据
}
//-------------------------------------------------------------------------------
unsigned char *GetDataBuf(unsigned char cnt)
{
unsigned int loc;//数据区的起始位置
xdata unsigned char buf[100];

FM24C256Read(2,(unsigned char *)&loc,2);

FM24C256Read((100+(cnt*sizeof(DataType))+(loc*sizeof(DataType))),buf,sizeof(DataType));
return buf;
}
//-------------------------------------------------------------------------------
//日期比较函数
//比较str1和str2
//str1>str2返回1
//str1==str2返回0
//str1<str2返回-1
signed char DateComp(char *str1,char *str2)
{
unsigned char i;
	for(i=0;i<6;i++)
	{
		if(*str1++>*str2++)return 1;
		if(*str1++<*str2++)return -1;
	}
return 0;
}
//-------------------------------------------------------------------------------
//根据日期数据查询
//pDate:比较用的日期数据
//loc:数据表中的绝对地址
//返回查到的绝对地址大于500时没有查到
unsigned int FindDateForDate(unsigned char *pDate,unsigned int inloc)
{
xdata unsigned char buf[100];
DataType *p = buf;

	for(;inloc<500;inloc++)
	{
		FM24C256Read(100+inloc*sizeof(DataType),buf,sizeof(DataType));	
		if(DateComp(p->datetime,pDate)>0)
		{//日期大于输入日期
			return inloc;
		}
	}
return 0xffff;
}
//-------------------------------------------------------------------------------


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -