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

MCU的环形FIFO

fifo.h

#ifndef __FIFO_H
#define __FIFO_H#include "main.h"#define RINGBUFF_LEN	(500)     //定义最大接收字节数 500typedef struct
{uint16_t Head;   										// 头指针 指向可读起始地址  每读一个,数字+1uint16_t Tail;											// 尾指针	指向可写的起始地址	 每写一个,数字+1,当尾指针超过数组大小,// 则尾指针又指向数组首地址。uint16_t Lenght;										// 长度uint8_t  Ring_data[RINGBUFF_LEN];		// 数据缓冲区
}RingBuff_t;uint16_t getRingBuffLenght(RingBuff_t *ringBuff);    // 获取缓冲区长度
void initRingBuff(RingBuff_t *ringBuff);
void writeRingBuff(RingBuff_t *ringBuff,uint8_t data);									 // 写入对应数据
void deleteRingBuff(RingBuff_t *ringBuff,uint16_t size);               // 删除对应长度的数据
uint8_t readRingBuff(RingBuff_t *ringBuff,uint16_t position);    // 读取对应位的数据/*   使用示例1.创建环形队列句柄RingBuff_t _ringBuff2.初始化initRingBuff(&_ringBuff);	3.添加数据HAL_UART_Receive_IT(&huart2,&_RxBuff[0],1);			// 打开串口中断	writeRingBuff(&_ringBuff,tjc_RxBuff[0]);4. 数据包解析#define FRAMELENGTH 6  // 数据包的长度void DataAnalysis()
{while(getRingBuffLenght(&tjc_ringBuff) >= FRAMELENGTH)    // 如果以及接收的数据长于数据包的长度{//校验帧头帧尾是否匹配if(readRingBuff(&tjc_ringBuff,0) != 0x55 ||readRingBuff(&tjc_ringBuff,4) != 0xff || readRingBuff(&tjc_ringBuff,5) != 0xff){deleteRingBuff(&tjc_ringBuff,1);									//不匹配删除1字节}else												  //匹配{																											// 数据处理 开始	 switch (readRingBuff(&tjc_ringBuff,1))			// 判断页面和控件{case 0x10:				// 左右break;default:break;}// 数据处理 结束		deleteRingBuff(&tjc_ringBuff,FRAMELENGTH);							// 删除对应数据包的break;}}
}*/#endif

fifo.c

#include <stdint.h>
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <fifo.h>/********************************************************
函数名:  	initRingBuff
功能:    	初始化环形缓冲区
输入参数:
返回值: 		void
修改记录:
**********************************************************/
void initRingBuff(RingBuff_t *ringBuff)
{//初始化相关信息ringBuff->Head = 0;ringBuff->Tail = 0;ringBuff->Lenght = 0;
}/********************************************************
函数名:  	writeRingBuff
功能:    	往环形缓冲区写入数据  每次写入一个数据
**********************************************************/
void writeRingBuff(RingBuff_t *ringBuff,uint8_t data)
{if(ringBuff->Lenght >= RINGBUFF_LEN) 								//判断缓冲区是否已满{return ;}ringBuff->Ring_data[ringBuff->Tail]=data;							//写入到尾数据ringBuff->Tail = (ringBuff->Tail+1)%RINGBUFF_LEN;			//防止越界非法访问 Tail=RINGBUFF_LEN 就为0//如果Tail指针已经到达缓冲区的末尾,那么Tail+1就会变成0   ringBuff->Lenght++;}																	// 数据长度+1/********************************************************
函数名:  	deleteRingBuff
功能:    	删除串口缓冲区中相应长度的数据  从头删除指定长度
输入参数:	要删除的长度
**********************************************************/
void deleteRingBuff(RingBuff_t *ringBuff, uint16_t size)
{if(size >= ringBuff->Lenght)        // 确保小于以有数据{initRingBuff(ringBuff);return;}for(int i = 0; i < size; i++){if(ringBuff->Lenght == 0)//判断非空{initRingBuff(ringBuff);return;}ringBuff->Head = (ringBuff->Head+1)%RINGBUFF_LEN;//防止越界非法访问ringBuff->Lenght--;}
}/********************************************************
函数名:  	readRingBuff
功能:    	从串口缓冲区读取1字节数据
输入参数:		position:读取的位置
返回值: 		所在位置的数据(1字节)  
**********************************************************/
uint8_t readRingBuff(RingBuff_t *ringBuff, uint16_t position)
{uint16_t realPosition = (ringBuff->Head + position) % RINGBUFF_LEN;return ringBuff->Ring_data[realPosition];
}/********************************************************
函数名:  	getRingBuffLenght
功能:    	获取串口缓冲区的数据数量
返回值: 		串口缓冲区的数据数量
**********************************************************/
uint16_t getRingBuffLenght(RingBuff_t *ringBuff)
{return ringBuff->Lenght;
}/********************************************************
函数名:  	isRingBuffOverflow
功能:    	判断环形缓冲区是否已满
返回值: 		1:环形缓冲区已满 , 2:环形缓冲区未满
**********************************************************/
uint8_t isRingBuffOverflow(RingBuff_t *ringBuff)
{return ringBuff->Lenght == RINGBUFF_LEN;
}

相关文章:

MCU的环形FIFO

fifo.h #ifndef __FIFO_H #define __FIFO_H#include "main.h"#define RINGBUFF_LEN (500) //定义最大接收字节数 500typedef struct {uint16_t Head; // 头指针 指向可读起始地址 每读一个&#xff0c;数字1uint16_t Tail; // 尾指针 指…...

使用proteus仿真51单片机的流水灯实现

proteus介绍&#xff1a; proteus是一个十分便捷的用于电路仿真的软件&#xff0c;可以用于实现电路的设计、仿真、调试等。并且可以在对应的代码编辑区域&#xff0c;使用代码实现电路功能的仿真。 汇编语言介绍&#xff1a; 百度百科介绍如下&#xff1a; 汇编语言是培养…...

【漏洞复现】Apache OFBiz 路径遍历导致RCE漏洞(CVE-2024-36104)

0x01 产品简介 Apache OFBiz是一个电子商务平台&#xff0c;用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。是美国阿帕奇(Apache)基金会的一套企业资源计划(ERP)系统。该系统提供了一整套基于Java的Web应用程序组件和工具。 0x02 …...

数据库表中创建字段查询出来却为NULL?

起因&#xff1a; 今天新创建了一张表,其中一个字段命名为"word_num"带下划线&#xff0c;我在前端页面怎么也查询不出来word_num的值&#xff0c;后来在后端接口处打印了一下数据库查询出来的数据&#xff0c;发现这个字段一直为NULL&#xff0c;然后我就想到是不是…...

缓存方法返回值

1. 业务需求 前端用户查询数据时,数据查询缓慢耗费时间; 基于缓存中间件实现缓存方法返回值:实现流程用户第一次查询时在数据库查询,并将查询的返回值存储在缓存中间件中,在缓存有效期内前端用户再次查询时,从缓存中间件缓存获取 2. 基于Redis实现 参考1 2.1 简单实现 引入…...

【十大排序算法】快速排序

在乱序的世界中&#xff0c;快速排序如同一位智慧的园丁&#xff0c; 以轻盈的手法&#xff0c;将无序的花朵们重新安排&#xff0c; 在每一次比较中&#xff0c;沐浴着理性的阳光&#xff0c; 终使它们在有序的花园里&#xff0c;开出绚烂的芬芳。 文章目录 一、快速排序二、…...

linux系统ubuntu中在命令行中打开图形界面的文件夹

在命令行中打开当前路径&#xff0c;以文件管理器的形式打开&#xff1a; 命令 # 打开文件管理器 当前的路径 nautilus .nautilus 是一个与 GNOME 桌面环境集成的文件管理器的命令行启动程序。在 Linux 系统中&#xff0c;特别是使用 GNOME 作为桌面环境时&#xff0c;用户经…...

【C++11数据结构与算法】C++ 栈

C 栈(stack) 文章目录 C 栈(stack)栈的基本介绍栈的算法运用单调栈实战题LC例题&#xff1a;[321. 拼接最大数](https://leetcode.cn/problems/create-maximum-number/)LC例题&#xff1a;[316. 去除重复字母](https://leetcode.cn/problems/remove-duplicate-letters/) 栈的基…...

pdf文件如何防篡改内容

PDF文件防篡改内容的方法有多种&#xff0c;以下是一些常见且有效的方法&#xff0c;它们可以帮助确保PDF文件的完整性和真实性&#xff1a; 加密PDF文档&#xff1a; 原理&#xff1a;通过设置密码来保护PDF文档&#xff0c;防止未经授权的访问和修改。注意事项&#xff1a;密…...

QT 音乐播放器【二】 歌词同步+滚动+特效

文章目录 效果图概述代码解析歌词歌词同步歌词特效 总结 效果图 概述 先整体说明一下这个效果的实现&#xff0c;你所看到的歌词都是QGraphicsObject&#xff0c;在QGraphicsView上绘制(paint)出来的。也就是说每一句歌词都是一个图元(item)。 为什么用QGraphicsView框架&…...

关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备(改进版)

主要最近做了一个要用STM32实现读取鼠标键盘一体的那种USB设备&#xff0c;STM32的界面上要和电脑一样的能通过这个USB接口实现鼠标移动&#xff0c;键盘的按键。然后我就很自然的去参考了正点原子的例程&#xff0c;可是找了一圈&#xff0c;发现正点原子好像用的库函数&#…...

Soildworks学习笔记(二)

放样凸台基体&#xff1a; 自动生成连接两个物体两个面的基体&#xff1a; 2.旋转切除&#xff1a; 3.剪切实体&#xff1a; 4.转换实体引用&#xff1a; 将实体的轮廓线转换至当前草图使其成为当前草图的图元,主要用于在同一平面或另一个坐标中制作草图实体或其尺寸的副本。 …...

Linux配置uwsgi环境

Linux配置uwsgi环境 1.进入虚拟环境 source /envs/django_-shop-system/bin/activate2.安装uwsgi pip install uwsgi3.基于uwsgi运行项目 – 基于配置文件 在项目目录下创建配置文件 #socket 0.0.0.0:8005 http 0.0.0.0:8005 # http120.55.47.111:8005 chdir/opt/www/djang…...

Nagios的安装和使用

*实验* *nagios安装和使用* Nagios 是一个监视系统运行状态和网络信息的监视系统。Nagios 能监视所指定的本地或远程主机以及服务&#xff0c;同时提供异常通知功能等. Nagios 可运行在 Linux/Unix 平台之上&#xff0c;同时提供一个可选的基于浏览器的 WEB 界面以方便系统管…...

Numba 的 CUDA 示例(4/4):原子和互斥

本教程为 Numba CUDA 示例 第 4 部分。 本系列第 4 部分总结了使用 Python 从头开始学习 CUDA 编程的旅程 介绍 在本系列的前三部分&#xff08;第 1 部分&#xff0c;第 2 部分&#xff0c;第 3 部分&#xff09;中&#xff0c;我们介绍了 CUDA 开发的大部分基础知识&#xf…...

【机器学习】机器学习引领AI:重塑人类社会的新纪元

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀机器学习引领AI &#x1f4d2;1. 引言&#x1f4d5;2. 人工智能&#xff08;AI&#xff09;&#x1f308;人工智能的发展&#x1f31e;应用领…...

【制作面包game】

编写一个制作面包的游戏代码涉及到游戏设计、编程和用户界面设计等多个方面。这里我可以提供一个简化版本的Python代码示例&#xff0c;用于创建一个基本的面包制作游戏。这个游戏将会有一个简单的用户界面&#xff0c;玩家可以通过输入命令来制作面包。 游戏的基本流程如下&a…...

Django更改超级用户密码

Django更改超级用户密码 1、打开shell 在工程文件目录下敲入&#xff1a; python manage.py shell再在python交互界面输入&#xff1a; from django.contrib.auth.models import User user User.objects.get(username root) user.set_password(123456) user.save()其中ro…...

ROS基础学习-ROS通信机制进阶

ROS通信机制进阶 目录 0.简介1.常用API1.1 节点初始化函数1.1.1 C++1.1.2 Python1.2 话题与服务相关函数1.2.1 对象获取相关1.2.1.1 C++1.2.1.2 Python1.2.2 订阅对象相关1.2.2.1 C++1.2.2.2 Python1.2.3 服务对象相关函数1.2.3.1 C++1.2.3.2 Python1.2.4 客户端对象相关1.2.4.…...

【Vue3】shallowReactive() and shallowReadonly()

历史小剧场 所谓历史&#xff0c;就是过去的事&#xff0c;它的残酷之处在于&#xff1a;无论你哀嚎&#xff0c;悲伤&#xff0c;痛苦&#xff0c;落寞&#xff0c;追悔&#xff0c;它都无法改变。 一具有名的尸体躺在无数无名的尸体上&#xff0c;这就是所谓的霸业。---- 《明…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...