在上一节只是稍微说了下数据缓存
https://www.cnblogs.com/yangfengwu/p/11769059.html
这节为了可以让大家直接应用起来,我封装了下.
咱们平时发送数据的时候最希望的是可以有个缓存,每次把要发送的数据存到缓存里面
需要发送的时候咱就去缓存里面去取
而且咱希望咱的缓存可以存储多条数据
发送的时候按照先进先出的原则把数据提取出来发出去
一,注意,这一节是对上一节的封装,请先看上一节
不过LoopList做了下改动
然后增加了 BufferManage 文件
具体为什么改动会在最后的注意事项说明
二,定义一个管理变量
buff_manage_struct buff_manage_struct1;
三,定义两个数组
一个用于交给环形队列用于缓存数据
另一个交给环形队列用于记录每次缓存数据的个数
注意: u32 Managebuff[10];
数组个数是10个,说明最多可以管理10条数据
u32 类型,说明每条数据个数最大长度是 2^32 个
四, 调用 BufferManageCreate函数
五,定义一个数组,用于提取缓存的数据
注意:提取先前存储的数据,然后缓存到一个数组里面
最后操作这个数组
一,每隔3S插入17字节的数据
主循环只要判断插入了数据就取出来用串口发送出去
#include "include.h"
#include "BufferManage.h"
buff_manage_struct buff_manage_struct1;
u8 buff[1024];//缓存数据的数组
u32 Managebuff[10];//记录每次缓存多少数据的数组
u8 SendBuff[1024];//提取数据以后存储的数组
int32_t Len;
char temp[17]="111111111111111\r\n";
int main(void)
{
NVIC_Configuration();
uart_init(115200); //串口初始化为115200
GpioInit();
DelayInit();
BufferManageCreate(&buff_manage_struct1,buff,1024,Managebuff,10);
while(1)
{
if(SysTickCntMs>=3000)
{
BufferManageWrite(&buff_manage_struct1,temp,17);//插入数据
SysTickCntMs=0;
}
Len = BufferManageRead(&buff_manage_struct1,SendBuff);//提取数据到SendBuff数组
if(Len>0)
{
UsartOutStr(SendBuff,Len);//串口发送缓存的数据
}
if(Usart1ReadFlage)//串口接收完一条完整的数据
{
Usart1ReadFlage=0;
memset(Usart1ReadBuff,NULL, sizeof(Usart1ReadBuff));//清零
}
}
}
每隔3S插入两份数据:用来模拟不定期插入多份数据
注:延时50ms是控制每隔50ms从里面提取一条数据
每条数据按照先进先出的原则
#include "include.h"
#include "BufferManage.h"
buff_manage_struct buff_manage_struct1;
u8 buff[1024];//缓存数据的数组
u32 Managebuff[10];//记录每次缓存多少数据的数组
u8 SendBuff[1024];//提取数据以后存储的数组
int32_t Len;
char temp[17]="111111111111111\r\n";
char temp1[40]="22222222222222222222222222222222222222\r\n";
int main(void)
{
NVIC_Configuration();
uart_init(115200); //串口初始化为115200
GpioInit();
DelayInit();
BufferManageCreate(&buff_manage_struct1,buff,1024,Managebuff,10);
while(1)
{
if(SysTickCntMs>=3000)
{
BufferManageWrite(&buff_manage_struct1,temp,17);//插入数据
BufferManageWrite(&buff_manage_struct1,temp1,40);//插入数据
SysTickCntMs=0;
}
Len = BufferManageRead(&buff_manage_struct1,SendBuff);//提取数据到SendBuff数组
if(Len>0)
{
UsartOutStr(SendBuff,Len);//串口发送缓存的数据
delay_ms(50);//延时50Ms,让每条数据之间有时间间隔
}
if(Usart1ReadFlage)//串口接收完一条完整的数据
{
Usart1ReadFlage=0;
memset(Usart1ReadBuff,NULL, sizeof(Usart1ReadBuff));//清零
}
}
}
其实简而言之
在需要发送数据的地方
只需要调用
BufferManageWrite(&buff_manage_struct1,temp,17);//插入数据 BufferManageWrite(&buff_manage_struct1,temp1,40);//插入数据
函数,把数据写入用于缓存数据的数组,内部函数同时会用另一个数组记录缓存的数据个数
在需要提取发送的地方调用一下函数
Len = BufferManageRead(&buff_manage_struct1,SendBuff);//提取数据到SendBuff数组 if(Len>0) { 操作发送的数据:SendBuff 数据长度:Len }
这样便会一条数据一条数据的提取出来,然后最终如何操作如何应用自行发挥.
一,首先先说明处理思路
如果缓存区没有数据,则每隔1ms查询一次
如果查询到了有数据,则提取出来,然后交由中断处理
然后查询间隔变为10ms (该间隔可调节)
10ms便是发送每一条数据之间的时间间隔
因为是一条数据一条数据的发送,咱需要让每条数据之间有间隔
这样才让另一头的接收端认为是两条数据,方便处理
二,