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

前言

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

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

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

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

  

  二,

  

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

时间: 2024-11-05 13:48:27

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

单片机模块化程序: 数据缓存封包-内存管理实现

前言 上一节使用的是环形队列实现的数据缓存 这节使用内存管理实现 内存管理使用的是 μC/OS-II 里面的内存管理程序 使用说明(第一种) 一,内存管理意味着有许多的内存块 然后每个内存块有固定的长度 内存块的长度假设定义的足够大,可以放入每条数据 原文地址:https://www.cnblogs.com/yangfengwu/p/12238511.html

java实现数据结构中的环形队列

最近在看数据结构,队列在数据结构中是个重要的元素. 定义:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 队列主要分为普通队列和环形队列,环形队列比普通队列的使用效率更高(普通队列容易造成内存的浪费,时间效率也会降低,主要体现在队列的删除操作上) 下面用java来实现队列,仅供参考 package demo; //环形队列 public class QueueDemo { //创建队列 public QueueDemo(int num){ m_iQueueCapacity=num;

微信小程序-数据缓存

每个微信小程序都可以有自己的本地缓存,可以通过 wx.setStorage(wx.setStorageSync).wx.getStorage(wx.getStorageSync).wx.clearStorage(wx.clearStorageSync)可以对本地缓存进行设置.获取和清理.本地缓存最大为10MB. 注意: localStorage 是永久存储的,但是我们不建议将关键信息全部存在 localStorage,以防用户换设备的情况. wx.setStorage(OBJECT) 将数据存储

Cache 应用程序数据缓存

System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类.此命名空间包括 Cache 类,该类是一个字典,您可以在其中存储任意数据对象,如哈希表和数据集.它还为这些对象提供了失效功能,并为您提供了添加和移除这些对象的方法.您还可以 添加依赖于其他文件或缓存项的对象,并在从 Cache 对象中移除对象时执行回调以通知应用程序. protected void Page_Load(object sender, EventArgs e) { string CacheKey = "c

小程序 数据缓存 wx.getStorage等等

使用范围很广.尤其是操作用户没有保存过,或者是最快捷获取已有的数据 三个步骤:1.设置需要缓存的数据 2.获取缓存的数据 3.用完后记得清除缓存. 异步和同步的情况  还需要根据实际情况来定,个人一般情况下使用的比较多的是: 1. wx.setStorage({ key: "name1", data: datalist //需要存储的数据 }) 2. wx.getStorageSync('name1') 3. wx.clearStorageSync() 具体可以参考 https://d

单片机模块化程序: CRC校验

前言 这一节说明一下数据传输中常用的CRC校验 所谓CRC校验,说白了就是对数据做下计算,然后把计算结果放到最后面 平时用的最多的算是CRC16 直接上菜 计算CRC /*** @brief calculate CRC* @param *modbusdata: Source data address* @param length: data length* @param * @retval CRC16 Value* @example **/int crc16_modbus(u8 *modbusd

小程序 数据缓存

Page({ data:{ // text:"这是一个页面" storageContent: '', storageSyncContent: '' }, onLoad:function(options){ // 页面初始化 options为页面跳转所带来的参数 }, /** * 异步存储 */ listenerStorageSave: function() { //以键值对的形式存储 传进去的是个对象 wx.setStorage({ key: 'key', data: '我是store

读jQuery源码之六(Data缓存和Queue队列)

源码3523-3706 Data对象及原型定义 1.accessData方法和Data函数.代码如下: jQuery.acceptData = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any /* jshint -W018 */ return owner.nodeType === 1 || owner.nodeTyp

cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )

Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Server 2005上执行 ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;语句让相应的数据库启用监听服务,以便支持SqlDependency特性. 添加一个 employee的数据库表. 1CREATETABLE[dbo].[employee](2[i