码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-01-22 14:47:05      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:0ms   知识点   完整   main   void   发送数据   使用说明   manage   lin   

 

 

 

 

 

前言

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

  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字节的数据

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

  技术图片

 

 

  技术图片

#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从里面提取一条数据

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

 

 

  技术图片

 

 

 

#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便是发送每一条数据之间的时间间隔

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

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

  

  二,

 

 

 

 

  

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

标签:0ms   知识点   完整   main   void   发送数据   使用说明   manage   lin   

原文地址:https://www.cnblogs.com/yangfengwu/p/12228402.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!