C语言——循环缓冲区

来源:互联网 发布:java中的多态 编辑:程序博客网 时间:2024/05/28 06:08

最近在搞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()一个空间,存取提取的数据,然后使用完再释放,这样就可以节省空间了。

0 0
原创粉丝点击