C语言——循环缓冲区

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值