C语言——循环缓冲区
2015-09-22 18:12
246 查看
最近在搞GSM模块,一个主要问题就是对于GSM接收数据的处理。而首先是把数据全部接收过来,搞了一个循环缓存区,感觉好可以。
#define ZPC_Debug SEGGER_RTT_printf
//#define ZPC_Debug(...)
#define DATA_RECV_BUFF_LEN 8192 //循环缓冲区大小
uint8_t gsm_recv_buff[DATA_RECV_BUFF_LEN] = {0}; //循环缓冲区
int16_t gsm_recv_buff_writePos = 0; //循环缓冲区写指针
int16_t gsm_recv_buff_readePos = 0; //循环缓冲区读指针
uint8_t gsm_data_buff[DATA_RECV_BUFF_LEN] = {0}; //读取数据存放地址
/* GSM-->STM 把数据放入循环缓冲区*/
void gsm_recv(uint8_t* buf, uint16_t len)
{
if (NULL==buf) return;
/* data-->buf */
if(len <= (DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos))
{
memcpy(&gsm_recv_buff[gsm_recv_buff_writePos],buf,len);
gsm_recv_buff_writePos += len;
}else
{
memcpy(&gsm_recv_buff[gsm_recv_buff_writePos],buf,(DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos));
memcpy(&gsm_recv_buff[0],&buf[(DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos)],(len-(DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos)));
gsm_recv_buff_writePos = (len-(DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos));
}
}
//读取当前数据
void get_recv_data()
{
/* buf-->data */
memset(gsm_data_buff,0,DATA_RECV_BUFF_LEN);
if(gsm_recv_buff_writePos>=gsm_recv_buff_readePos)
{
memcpy(gsm_data_buff,&gsm_recv_buff[gsm_recv_buff_readePos],gsm_recv_buff_writePos-gsm_recv_buff_readePos);
gsm_recv_buff_readePos = gsm_recv_buff_writePos;
}else
{
memcpy(gsm_data_buff,&gsm_recv_buff[gsm_recv_buff_readePos],DATA_RECV_BUFF_LEN-gsm_recv_buff_readePos);
memcpy(&gsm_data_buff[DATA_RECV_BUFF_LEN-gsm_recv_buff_readePos],&gsm_recv_buff[0],gsm_recv_buff_writePos);
gsm_recv_buff_readePos = gsm_recv_buff_writePos;
}
ZPC_Debug(0,"** get_recv_data is:%s\r\n",gsm_data_buff);
}
目前的问题还有就是get_recv_data()读取的当前数据需要一个固定的大小的空间,后续准备修改成malloc()一个空间,存取提取的数据,然后使用完再释放,这样就可以节省空间了。
#define ZPC_Debug SEGGER_RTT_printf
//#define ZPC_Debug(...)
#define DATA_RECV_BUFF_LEN 8192 //循环缓冲区大小
uint8_t gsm_recv_buff[DATA_RECV_BUFF_LEN] = {0}; //循环缓冲区
int16_t gsm_recv_buff_writePos = 0; //循环缓冲区写指针
int16_t gsm_recv_buff_readePos = 0; //循环缓冲区读指针
uint8_t gsm_data_buff[DATA_RECV_BUFF_LEN] = {0}; //读取数据存放地址
/* GSM-->STM 把数据放入循环缓冲区*/
void gsm_recv(uint8_t* buf, uint16_t len)
{
if (NULL==buf) return;
/* data-->buf */
if(len <= (DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos))
{
memcpy(&gsm_recv_buff[gsm_recv_buff_writePos],buf,len);
gsm_recv_buff_writePos += len;
}else
{
memcpy(&gsm_recv_buff[gsm_recv_buff_writePos],buf,(DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos));
memcpy(&gsm_recv_buff[0],&buf[(DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos)],(len-(DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos)));
gsm_recv_buff_writePos = (len-(DATA_RECV_BUFF_LEN-gsm_recv_buff_writePos));
}
}
//读取当前数据
void get_recv_data()
{
/* buf-->data */
memset(gsm_data_buff,0,DATA_RECV_BUFF_LEN);
if(gsm_recv_buff_writePos>=gsm_recv_buff_readePos)
{
memcpy(gsm_data_buff,&gsm_recv_buff[gsm_recv_buff_readePos],gsm_recv_buff_writePos-gsm_recv_buff_readePos);
gsm_recv_buff_readePos = gsm_recv_buff_writePos;
}else
{
memcpy(gsm_data_buff,&gsm_recv_buff[gsm_recv_buff_readePos],DATA_RECV_BUFF_LEN-gsm_recv_buff_readePos);
memcpy(&gsm_data_buff[DATA_RECV_BUFF_LEN-gsm_recv_buff_readePos],&gsm_recv_buff[0],gsm_recv_buff_writePos);
gsm_recv_buff_readePos = gsm_recv_buff_writePos;
}
ZPC_Debug(0,"** get_recv_data is:%s\r\n",gsm_data_buff);
}
目前的问题还有就是get_recv_data()读取的当前数据需要一个固定的大小的空间,后续准备修改成malloc()一个空间,存取提取的数据,然后使用完再释放,这样就可以节省空间了。
相关文章推荐
- C++的一些心得
- 黑马程序员——IOS学习笔记(C语言存储方式和变量作用域)
- 黑马程序员——IOS学习笔记(C语言指针)
- c++ 使用throw抛出异常
- c++map的用法
- 乘法口诀表,C语言实现
- 黑马程序员——IOS学习笔记(C语言字符串和数组)
- 详解C++中基类与派生类的转换以及虚基类
- C语言:n=(i=2,++i)什么意思?结果是什么?
- C语言结构体小结
- c++primer第三章习题(1)
- c语言怎么获取数组的长度
- C++小插曲--strncmp函数
- C语言指针参数陷阱
- C++设计模式——适配器模式
- c++客户端文件上传到c#ashx
- C++隐式转换
- 深入解析C++中类的多重继承
- Effective C++——条款52(第8章)
- C++设计模式——抽象工厂模式