环形缓存区设计源码
来源:互联网 发布:免费占卜塔罗牌软件 编辑:程序博客网 时间: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)
{
}
- 环形缓存区设计源码
- C 环形缓存区
- 环形缓存区bufferC语言实现
- 环形缓存区bufferC语言实现
- 环形缓存区bufferC语言实现
- 环形缓存(java版)
- 环形缓存(C#版)
- c# 同步功能的环形缓存区ReadWrite RingBuffer
- 缓冲区设计--环形队列
- 缓冲区设计--环形队列
- 【oschina android源码分析】缓存的设计
- 环形缓冲区类(C++源码
- wjp:环形缓存区bufferC语言实现——致敬曾CQ!
- Mybatis源码研究7:缓存的设计和实现
- Mybatis源码研究7:缓存的设计和实现
- ibatis源码学习(五)缓存设计和实现
- OSChina客户端源码学习(2)--缓存的设计
- Mybatis源码研究7:缓存的设计和实现
- 链表——逆序输出
- poj-1942
- 关于使用php的spl_object_hash生成GUID
- 关于Java String.split 的记录
- 所有操作系统列表
- 环形缓存区设计源码
- 如何在Python中使用urllib2
- 模仿vine实现android视频的可间断录制和播放[basic]
- Xamarin.ios 使文件以自己应用程序方式打开 open in
- leetcode之Combination Sum
- IOS 30多个iOS常用动画,带详细注释
- 贪心——理工大办活动
- 研一计划
- 操作系统标识宏