环形缓存区设计源码

来源:互联网 发布:免费占卜塔罗牌软件 编辑:程序博客网 时间:2024/05/23 21:37

下面是本人写的环形缓存区,请高手指正、优化,大家一起交流。

#define DATA_SIZE512//协议最长帧字节数*2+若干字节


#define Frame_headerlength5//帧头长度


#define DATA_LONGTH_Location13//定义数据位置长度,计算方法:数据域长度+固定字节长度


#define Fixed_byte_length16//定义数据位置长度,计算方法:数据域长度+固定字节长度


unsigned char Frame_headerdata[Frame_headerlength]=[0xFE,0xFE,0xFE,0xFE,0x68];//针头数据


unsigned char rxd_data[DATA_SIZE];//接收缓存区


unsigned short RealTime_datalength;//实时数据接收长度


unsigned short ContinuouslyReceive_datalength;//本帧内连续接收数据长度


unsigned short Frame_datalength;//本帧字节长度


unsigned short pBuffer_stored;//本次存入缓存区地址,本次接收数据存入接收缓存区地址,一帧可能分好多次接收


unsigned short pFrame_stored;//本帧在缓存区地址,查找针头开始地址


unsigned short pFrame_header;//本帧针头在缓存区地址


unsigned char Frame_headerflag;//找到帧头标志


unsigned char Frame_startflag;//帧开始接收标志,即本帧第一个数据接收标志


void Init(void)
{
RealTime_datalength=0;
ContinuouslyReceive_datalength=0;
Frame_datalength=0;
Frame_startflag=0;
Frame_headerflag=0;

pBuffer_stored=rxd_data;
pFrame_stored=rxd_data;
pFrame_header=rxd_data;
}






void Read_buffer(BYTE * buff,DWORD m_datalength)
{
unsigned shorti=0;

if(Frame_startflag==0x00)//防止定时器重复设置
{
Frame_startflag=0xA5;
/****启动接收超时定时器******/
SetTimer(WM_TIMER1,3000,NULL);
}

for(i=0;i<m_datalength;i++)
{
if(pBuffer_stored+i>=rxd_data+DATA_SIZE)//防止内存越界
{
pBuffer_stored=rxd_data;
}
*(pBuffer_stored+i)=buff[i];
}
pBuffer_stored+=i;

if(pBuffer_stored>=rxd_data+DATA_SIZE)//防止内存越界
{
pBuffer_stored=rxd_data;
}

ContinuouslyReceive_datalength+=m_datalength;//记录连续接收数据长度


if(Frame_headerflag==0x00)//防止重复查找
{
if(ContinuouslyReceive_datalength>=Frame_headerlength)
{
for(i=0;i<ContinuouslyReceive_datalength+1-Frame_headerlength;i++)
{
if((*((pFrame_stored+i  )%(rxd_data+DATA_SIZE))==Frame_headerdata[0]) 
&& (*((pFrame_stored+i+1)%(rxd_data+DATA_SIZE))==Frame_headerdata[1]) 
&& (*((pFrame_stored+i+2)%(rxd_data+DATA_SIZE))==Frame_headerdata[2]) 
&& (*((pFrame_stored+i+3)%(rxd_data+DATA_SIZE))==Frame_headerdata[3]) 
&& (*((pFrame_stored+i+4)%(rxd_data+DATA_SIZE))==Frame_headerdata[4]))

{
break;
}
}

if(i!=ContinuouslyReceive_datalength+1-Frame_headerlength)//找到针头
{
pFrame_header=(pFrame_stored+i)%(rxd_data+DATA_SIZE);
Frame_headerflag==0xA5;
}
else
{
Frame_headerflag==0x00;
//*******如果想显示乱码数据,屏蔽下面语句********//
// pFrame_stored=pBuffer_stored;//丢弃接收数据
// ContinuouslyReceive_datalength=0;
}
}
}
else
{
unsigned shortTemporary_variables=0;//计算目前有效帧长
if(pBuffer_stored>=pFrame_header)
{
Temporary_variables=pBuffer_stored-pFrame_header;
}
else
{
Temporary_variables=pBuffer_stored+(rxd_data+DATA_SIZE)-pFrame_header;
}

if(Temporary_variables>=DATA_LONGTH_Location)
{
if(*((pFrame_header+DATA_LONGTH_Location)%(rxd_data+DATA_SIZE))+Fixed_byte_length<=ContinuouslyReceive_datalength)//接收完毕
{

/*************关闭定时器**************/
pFrame_stored=(pFrame_header+(*((pFrame_header+DATA_LONGTH_Location)%(rxd_data+DATA_SIZE))+Fixed_byte_length))%(rxd_data+DATA_SIZE);//继续接收后一帧
ContinuouslyReceive_datalength=0;

PostMessage();
//*******如果想显示乱码数据,屏蔽下面语句********//
// pFrame_stored=pBuffer_stored;//丢弃接收数据
}
}
}
}


void Data_Analysis(DWORD m_datalength)
{


}


//*****定时器*******//
void OnTimer(UINT nIDEvent)
{
}

0 0
原创粉丝点击