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