STM32串口环形队列

2023-11-14

一 环线队列

在设计串口驱动的过程中,要遵循的两条准则是:
1:尽量的减少程序运行的时间。
2:尽量的减少程序所占用的内存。

单片机相对于电脑来说,单片机的储存空间和电脑的存储空间根本不是一个量级。电脑并不用过多考虑内存的多少,而单片机就需要考虑所写的代码占用了多少内存,是否超过了单片机的存储空间。

本次的学习的环形队列就比较好的解决了这一个问题,顾名思义,是将数据放在一个头尾相接的数组之中,当然这只是想象的,但是代码可以将其实现。

 可以将发送缓冲区建立成一个环形的缓冲区,在这个环形缓冲区内,通过头指针(HostIndex)和尾指针(HostIndex)来定位空白区和数据区。
(1):头指针(HostIndex)指向有数据区的顶部,每次写入数据,都更新头指针,如果到了缓冲区的末端(EndIndex),就自动返回到缓冲区的起始处(StartIndex),直到写入到尾指针处为止,这时缓冲区已经被装满,不能再装入数据。
(2):尾指(TailIndex)针指向有数据区的尾部,当数据发送完毕后,更新尾指针的位置,如果到了缓冲区的末端(EndIndex),就自动返回到缓冲区的起始处(StartIndex),直到遇到头指针为止,这是证明所有的数据已经发送完毕。

如此图

1 实验题目

所以我设计这样一个题目:将未知长度的数组1每隔一段时间,以环线队列的方式全部存入数组2之中。如果这个数组2之中有新数据,就需要串口进行发送,直到发送完毕。

二 程序框图

  首先定义,数组1数据存到数组2 叫做 存。     数组2数据 通过串口发送 叫做  发。

解释一下,首指针在这里表示每存一位数据,首指针就会+1,尾指针同理,每发送一位数据,尾指针就会+1。

每次函数进来,time都会+1,没有到1000时,就会跳过存阶段,就会去判断是否该发送了,具体需要判断 上一次是否发完和发送完成标志位是否为1 (发送已经完成),time达到1000时,就会存数据。

三 代码部分

1 利用 cubemx 生成初始化代码

时钟部分省略,参数根据自己进行调整。

 2 编写模块代码

本次实验使用的是 stm32c8t6 型号单片机

uint16_t   x[10] = {1,2,3,4,5,6,7,8,9,10};  /*假设的数组1*/

uint32_t   time;
uint16_t   buf[16]; 数组2
uint8_t   i;
uint8_t   current = 0; 首指针
uint8_t   prent = 0;  尾指针

/**
 * \brief   环形队列 串口发送
 *
 * \param   [in]  需要发送的数组
 *
 * \retval  无
 */

void UART_CircleTransmit(uint16_t param[])
{
time ++;
if(time > 1000000)
	{
	for(i = 0;i < (sizeof(x) / sizeof(x [0]));i++)
		{
		buf[(current + i)%16] = param[i];
		}
		current=(current + i)%16;
	}
if(current != prent && (USART1->SR & 1<<6))
		{
		USART1-> DR = buf[prent++] ;
		prent = prent%16 ; 
		time = 0;
		}
}

3 测试效果

 这张图是 存完数据,通过串口全部发出之后,存的第二次,从第10位开始存,存到15位之后有从头开始存,将之前的1覆盖掉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32串口环形队列 的相关文章

  • Linux系统查看硬盘空间的常用命令!

    在Linux系统中 查看硬盘空间使用情况可以使用命令来完成 其中比较常见的命令有 df和du 那么它们具体如何使用呢 本文为大家详细介绍一下 快来学习吧 查看磁盘空间 df df命令以磁盘分区为单位查看文件系统中磁盘空间的使用情况 选项 h
  • VS2019 + Qt5.12 配置完成后,无法打开 Qt 源文件解决方案(非常实用)

    注 本文主要是解决 VS 无法打开 Qt 源文件问题 关于 VS Qt 配置问题 网上一搜一大堆 各个版本都有 这里就不做详细阐述了 最近自己在使用 VS2019 建立 Qt 工程的时候 遇到了无法打开 Qt 源文件问题 在网上阅读了大量的
  • 每天一个设计模式之 -- 组合模式

    组合模式 组合模式 Composite Pattern 又叫部分整体模式 是用于把一组相似的对象当作一个单一的对象 组合模式依据树形结构来组合对象 用来表示部分以及整体层次 这种类型的设计模式属于结构型模式 它创建了对象组的树形结构 这种模
  • 基于TCP的Socket网络编程

    前言 Socket通信是基于TCP IP协议的通信 在工作和做项目中应用非常广 下面来介绍下Socket网络编程 Socket的介绍 首先 在Socket网络编程中我们要了解两个重要的东西 ip和端口号 一台拥有IP地址的主机可以提供许多服
  • HttpContext在一般程序中无法引用

    刚刚写代码的时候 发现在类库的程序中无法直接使用HttpContext 经过学习发现 只要在引用上右击弹出下面界面 然后点击程序集 直接在搜索框中搜web 然后选用System Web 确定 再在你的cs文件中using System We

随机推荐

  • isolation forest在MATLAB和python上的简单应用

    isolation forest在MATLAB和python上的简单应用 1 问题描述 2 isolation forest 3 MATLAB实现isolation forest 4 python实现isolation fores 5 遇到
  • 【linux学习笔记】红帽Linux 7.8系统在虚拟机上的安装

    目录 一 打开VMware 选择新建虚拟机选项 二 选择自定义 并且点击下一步 三 可以选择默认继续下一步 可以进行更改虚拟机硬件兼容性 四 继续下一步 选择稍后安装系统 五 下一步选择客户操作系统Red Hat Enterprise Li
  • Centos8无法用yum下载

    原因 CentOS 8操作系统版本结束了生命周期 EOL Linux社区已不再维护该操作系统版本 解决方案 在服务器上执行如下代码 1 curl o etc yum repos d CentOS Base repo https mirror
  • 遍历Redis集群中的所有Key

    文章目录 1 背景s 2 需求 3 实现思路 4 SCAN 简介 5 用Jedis来实现Key扫描 5 1 基础的辅助工具类 5 2 批处理停止开关 5 3 扫描结果回调函数 5 4 实现单个Redis节点的Key扫描 5 5 实现Redi
  • 从软件的角度看待PCI和PCIE(二)

    PCI电路图 如图所示AD0 AD31 A表示地址 D表示数据 PCI是并行接口 怎么去分辨别当前使用的是地址还是数据呢 是根据FRAME这个引脚来分辨的 上面可以看出PCI是并行接口 在我们的印象中 并口传输的速率会比较高 但是当速率达到
  • mysql delete limit 使用方法详解

    一 mysql delete limit优点 用于DELETE的MySQL唯一的LIMIT row count选项用于告知服务器在控制命令被返回到客户端前被删除的行的最大值 本选项用于确保一个DELETE语句不会占用过多的时间 您可以只重复
  • php md化的nav,宝塔面板搭建onenav – 使用PHP开发的简约导航/书签管理系统

    onenav 使用PHP SQLite 3开发的简约导航 书签管理器 用宝塔搭建体验了一番 效果不错 这篇文章就来说说用宝塔搭建的体验教程 之前也介绍过Shiori书签管理程序 基于docker安装 喜欢的可以看看 1 功能特点支持后台管理
  • windows 只能同时 启动一个_如何将U盘一分为二(启动分区和存储分区两不误)...

    现在网上有很多关于U盘分区的帖子 有的方法过时不适用 有的过于深奥繁琐 难道将U盘一分为二 做成一个启动盘 文件存储盘有那么难吗 小编找来一篇有详实操作体验的U盘分区心得文章 希望能传达一个将U盘分成启动和存储两个分区的有效方法给广大用户们
  • ROS与navigation教程——ACML参数配置

  • 系统架构设计专业技能 · 信息系统基础

    系列文章目录 系统架构设计专业技能 网络技术 三 系统架构设计专业技能 系统安全分析与设计 四 系统架构设计师 系统架构设计高级技能 软件架构设计 一 系统架构设计师 系统架构设计高级技能 系统质量属性与架构评估 二 系统架构设计师 系统架
  • 一.初识Spring Boot ,了解什么是spring boot 及他的优点缺点应用背景

    目录 1 spring 能做什么 spring网站的提供的 2 为什么用SpringBoot 官网信息 3 1 SpringBoot优点 3 2 SpringBoot缺点 4 springboot 出现的时代背景 4 1 微服务 这是提出的
  • GPT专业应用:生成电影解说词

    正文共 969 字 阅读大约需要 3 分钟 内容创作者必备技巧 您将在3分钟后获得以下超能力 快速生成电影解说词 Beezy评级 B级 经过简单的寻找 大部分人能立刻掌握 主要节省时间 推荐人 Kim 编辑者 Linda 图片来源 Lexi
  • UI系统——作业与练习

    血条 Health Bar 的预制设计 具体要求如下 分别使用 IMGUI 和 UGUI 实现 使用 UGUI 血条是游戏对象的一个子元素 任何时候需要面对主摄像机 分析两种实现的优缺点 给出预制的使用方法 IMGUI制作血条 using
  • easy-excel批量导出数据

    easy excel批量导出 前言 最近遇到个用户数据批量导出excel的需求 第一次看到这个需求大家第一时间想到的应该大多都是easy excel这个框架吧 哈哈 我第一时间想到的也是这个框架 但是对于少量的数据 比如有10个用户这样的数
  • 项目一 计算器

    目录 学习目标 1 1准备工作 1 1 1搭建QT开发环境 1 2用户界面UI设计 1 2 1显示模块 1 2 2按键模块 1 3功能实现 1 3 1输入输出反馈 1 3 2退格与清除功能 1 3 3浏览历史记录与历史记录清除功能 1 3
  • Matlab第二版(本科教学版)

    matlab程序 数字图像处理第二版 本科教学版 第七章 图像分割 注 代码原因 程序源码中笑脸 符合都为 例7 1 点检测 程序源码 f imread D photo DIP3E CH05 Original Images Fig0524
  • 语音特征公式与python实现

    参考pyAudioAnalysis openSmile以及语音信号处理实验教程 MATLAB源代码 Introduction to Audio Analysis A Matlab Approach 完整测试文件 注意 以下代码不在genFe
  • uboot下载与安装

    uboot下载 uboot的下载链接 Index of pub u boot denx de uboot安装 这里使用uboot 2012 04 01版本 配合韦东山的s3c2440开发板做实验 如下图 tar zvfx u boot 20
  • linux入门学习(3权限管理)

    权限管理 一 文件或目录的权限查看 1 文件权限的查看 两种查看文件详细信息的方法 ls l file 查看file文件的详细信息 如果是目录 则是查看该目录下的所有子文件的详细信息 ls ld dir 查看dir目录的详细信息 2 文件权
  • STM32串口环形队列

    一 环线队列 在设计串口驱动的过程中 要遵循的两条准则是 1 尽量的减少程序运行的时间 2 尽量的减少程序所占用的内存 单片机相对于电脑来说 单片机的储存空间和电脑的存储空间根本不是一个量级 电脑并不用过多考虑内存的多少 而单片机就需要考虑