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()一个空间,存取提取的数据,然后使用完再释放,这样就可以节省空间了。
- C语言——循环缓冲区
- C语言——缓冲区
- 循环缓冲区的C语言实现
- 【数据结构】环形缓冲区/循环队列 C语言实现
- c语言练习 循环结构 缓冲区 逗号表达式
- C语言——字符I/O与缓冲区
- c语言笔记——对缓冲区的理解
- 缓冲区设计—线程间通讯(C语言程序实现)
- C语言输入输出缓冲区
- c语言输入输出缓冲区
- c语言的缓冲区
- C语言的缓冲区
- C语言中缓冲区
- c语言缓冲区
- C语言 环形缓冲区
- C语言 队列缓冲区
- Objective-C实现循环缓冲区
- Boost::circular_buffer——循环缓冲区
- java list三种遍历方法性能比较
- 下载文件
- HttpClient和HttpURLConnection的区别
- Intent 传递 List 利用Serializable
- Android应用程序破解
- C语言——循环缓冲区
- Codeforces Round #260 (Div. 1) B. A Lot of Games Trie + 博弈
- maven 新建web项目
- Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作
- Android中ListView(gridview)的item中有button等子点击控件时不能响应点击事件的原因
- php中mysql_real_escape_string+sprintf防止sql注入
- 如何验证远程服务器上文件是否存在
- 欧拉函数题集
- Android :关于小数相加出现很多位的 BigDecimal 也会有时不靠谱原因