您的位置:首页 > 编程语言 > C语言/C++

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()一个空间,存取提取的数据,然后使用完再释放,这样就可以节省空间了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: