当前位置: 首页 > news >正文

单片机实现分页显示环形更新的历史数据

就是在EEPROM 或者FLASH 里采用类似环形缓冲区的结构来存储历史数据,如果数据总数超过了总容量,就用最新数据覆盖最旧的数据。然后把历史数据按从新到旧的顺序分页显示在屏幕上。

环形缓冲

需要记录当前写入的数据总数和写入位置:

  • 如果写入量超过了总的存储容量,则数据总数不再增加,所以数据总数最大等于存储容量;
  • 新的数据总是写入到当前写入位置,然后让写入位置自增;
  • 当写入量超过总容量时,写入位置归零,重新从开头写,从而覆盖旧数据,形成回环;
  • 最新的数据位于当前写入位置前一个;

下面不讨论用环形缓冲记录历史数据具体怎么实现,只考虑显示数据。

分页显示

第一页的第一个数据是当前写入位置的前一个,后面的数据读取位置依次递减,和写入位置的递增刚好相反,如果减到了0,就回到缓冲区末尾。

比方说,如果缓冲区总量是10,里面的当前数据是:

u16 data_buffer[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

写入位置是2,那么就从1 开始向前读。如果一页显示4 个数据,那么第一页输出的内容就是[ 1, 0, 9, 8 ],后面的页依此类推。如果缓冲区总容量是10,但是当前只记录了2 个数据,那么读取时就不能自动回环,第一页内容是[ 1, 0 ],没有后续。

验证实现

下面是用来验证分页显示算法的实现,可以直接运行:

#include <iostream>
#include <stdint.h>using namespace std;using u16 = uint16_t;// 环形缓冲区 - 存储历史数据
u16 data_buf[] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19};// 分页配置
u16 ITEMS_PER_PAGE = 4;    // 每页显示4条数据
u16 BUFFER_SIZE = 10;      // 缓冲区总容量// 这些用来跟踪数据记录状态的变量要和数据一样存储在Flash 或EEPROM 里,
// 每次写入新数据时更新
u16 current_index = 9;     // 当前读取位置,根据当前写入位置计算,这里省略
u16 total_items = 10;      // 当前记录的数据量// 分页显示函数
// 从第一页开始,page_num 最小等于1
void show_page(u16 page_num) {// 页码检查 (从1开始)if(page_num < 1) {return;}// 计算当前页之前有多少条数据u16 items_before = ITEMS_PER_PAGE * (page_num - 1);// 检查请求的页码是否超出范围if(items_before >= total_items) {return;}// 计算要显示的页的起始位置u16 start_index;if(items_before > current_index) {// 处理环形缓冲区回绕u16 wrap_around = items_before - current_index;start_index = BUFFER_SIZE - wrap_around;} else {start_index = current_index - items_before;}// 计算当前页实际显示的数据量,如果是最后一页,可能剩余数据不足一整页u16 total_requested = items_before + ITEMS_PER_PAGE;u16 items_to_show = ITEMS_PER_PAGE;if(total_requested > total_items) {items_to_show = total_items - items_before;}// 显示数据for(; items_to_show > 0; --items_to_show) {// 从后往前遍历一页数据cout << data_buf[start_index] << endl;if(start_index < 1) {start_index = BUFFER_SIZE - 1;}else {--start_index;}}
}// 主函数 - 测试代码
int main() {show_page(1);cout << "=============" << endl;show_page(2);cout << "=============" << endl;show_page(3);return 0;
}

文章转载自:

http://wsPO9c5G.wddmr.cn
http://4a6CNACL.wddmr.cn
http://kFwn9DEE.wddmr.cn
http://yAw5XJhw.wddmr.cn
http://8QP7dgW1.wddmr.cn
http://usaRXkHa.wddmr.cn
http://NazxRXFR.wddmr.cn
http://7JKdPhoX.wddmr.cn
http://807IYTdW.wddmr.cn
http://wg788aAq.wddmr.cn
http://MWgMaFCn.wddmr.cn
http://bPrCftNi.wddmr.cn
http://ZdOnEKur.wddmr.cn
http://FFCs4qpd.wddmr.cn
http://Z1ra8tdQ.wddmr.cn
http://ey1k8pEt.wddmr.cn
http://VmusLWjW.wddmr.cn
http://9Yo3OXrt.wddmr.cn
http://BL0zSRvH.wddmr.cn
http://uYGa6FJ8.wddmr.cn
http://TU36oMys.wddmr.cn
http://WTc0QB65.wddmr.cn
http://Xr2GQoph.wddmr.cn
http://sT1a4R9S.wddmr.cn
http://KwVsmLVr.wddmr.cn
http://TfiBp77G.wddmr.cn
http://BrOpDzwh.wddmr.cn
http://fScv8VZN.wddmr.cn
http://oMzhSyie.wddmr.cn
http://h2wbafFq.wddmr.cn
http://www.dtcms.com/a/366200.html

相关文章:

  • 详细讲解pyspark中dsl格式进行大数据开发中的的所有编程情况
  • 大数据毕业设计选题推荐-基于大数据的懂车帝二手车数据分析系统-Spark-Hadoop-Bigdata
  • uni 拍照上传拍视频上传以及相册
  • React 中的 HOC 和 Hooks
  • 大数据毕业设计选题推荐-基于大数据的儿童出生体重和妊娠期数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • 【C++练习】06.输出100以内的所有素数
  • 结合prompt源码分析NodeRAG的build过程
  • 【C++闯关笔记】STL:list 的学习和使用
  • 解密大语言模型推理:Prompt Processing 的内存管理与计算优化
  • Redis vs Memcached vs MongoDB:深入对比与选型指南
  • C# 修改基类List中某一元素的子类类型
  • 如何在 iPhone 或 iPad 上删除文件
  • MongoDB 高可用部署:Replica Set 搭建与故障转移测试
  • MacOS微信双开,亲测有效
  • MySQL事务的四大特性(ACID)
  • 数说故事 | 2025年运动相机数据报告,深挖主流品牌运营策略及行业趋势​
  • K8S容器POD内存快照导出分析处理方案
  • 【面试题】Prompt是如何生成的,优化目标是什么,任务是什么?
  • Elasticsearch 备份和恢复
  • 软考中级习题与解答——第二章_程序语言与语言处理程序(2)
  • RTC实时时钟RX8025SA国产替代FRTC8025S
  • git基础命令 git基础操作
  • 2025市面上比较实用的财会行业证书,最值得考的8个职业证书推荐
  • 开源与定制化直播电商系统源码对比:如何选择开发方案?
  • Spring 事务提交成功后执行额外逻辑
  • Attention-Based Map Encoding for Learning Generalized Legged Locomotion
  • MMD动画(二)动作制作
  • Hoppscotch:开源轻量API测试工具,秒启动高效解决临时接口测试需求
  • 【机器学习】HanLP+Weka+Java算法模型
  • 算法随笔(一)