前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单片机模块化程序: 数据缓存封包-环形队列实现

单片机模块化程序: 数据缓存封包-环形队列实现

作者头像
杨奉武
发布2020-02-14 15:05:10
8990
发布2020-02-14 15:05:10
举报
文章被收录于专栏:知识分享知识分享

前言

  在上一节只是稍微说了下数据缓存

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函数

  五,定义一个数组,用于提取缓存的数据

    注意:提取先前存储的数据,然后缓存到一个数组里面

    最后操作这个数组

测试1

  一,每隔3S插入17字节的数据

  主循环只要判断插入了数据就取出来用串口发送出去

代码语言:javascript
复制
#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));//清零
        }
    }
}

测试2

  每隔3S插入两份数据:用来模拟不定期插入多份数据

  注:延时50ms是控制每隔50ms从里面提取一条数据

  每条数据按照先进先出的原则

代码语言:javascript
复制
#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便是发送每一条数据之间的时间间隔

  因为是一条数据一条数据的发送,咱需要让每条数据之间有间隔

  这样才让另一头的接收端认为是两条数据,方便处理

  二,

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 使用说明
  • 测试1
  • 测试2
  • 以上测试说明
  • 扩展:使用串口中断发送缓存的数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档