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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现Ingress-Nginx Controller高可用方案

文章目录 前提准备1.修改Ingress-Controller 运行模式为hostNetwork并生效2.给部署ingress-controller的节点打标签3.查看ingress-controller的部署情况 方式一&#xff1a;LVSKeepalivedNginxIngress一、部署ipvsadm和keepalived二、配置keepalived1.配置lvs01(keepalived mas…

Java Web学习笔记27——对话框、表单组件

常见组件对话框&#xff1a; Dialog对话框&#xff1a;在保留当前页面状态下&#xff0c;告知用户并承载相关操作。 dialogTableVisible: false 默认是不可见的。 在按钮属性中设置为true的意思&#xff0c;点击按钮的时候&#xff0c;才会true&#xff0c;对话框才会显示。 …

python Tk 获取输入框内容,分割内容

创建输入框、一个按钮和一个标签的GUI。 用户可以在输入框中输入文本&#xff0c;点击按钮后&#xff0c;程序将在控制台打印输入的文本&#xff08;已经分割为列表&#xff09;&#xff0c;并在GUI中的标签上显示一些静态文本。 import tkinter as tk# 创建主窗口 root tk.…

基于SpringBoot+Vue学生请假管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

gitlab中配置全局钩子

设置全局pre-receive hooks vi /etc/gitlab/gitlab.rb #打开下面配置 gitaly[custom_hooks_dir] "/var/opt/gitlab/gitaly/custom_hooks" #保存退出 #创建钩子目录 mkdir -p /var/opt/gitlab/gitaly/custom_hooks/pre-receive.d cd /var/opt/gitlab/gitaly/custom_…

Netty网络应用框架

一.Netty 是什么? Netty 是一个基于 Java 的异步事件驱动网络应用框架&#xff0c;主要用于构建高性能、高可扩展性的网络服务器和客户端。Netty 提供了丰富的功能和工具集&#xff0c;使得开发网络应用程序变得更加简便和高效。 1.Netty 的优点 1.高性能: 异步和事件驱动架构…

linux指令--sed

sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法解析 sed [选项] 编辑命令 文件 选项&#xff1a; -n&#xff1a;只显示匹配处理的行-e&#xff1a;执行多个编辑命令时-i&#xff1a;在原文件中进行修改&#xff0c;不输出到屏幕-…

常见知识点总结

文章目录 for of和for in区别 同源策略跨域资源共享跨域问题解决跨域jsonpcors方式nginx代理方式 apply,bind,call相同点不同点 js判断数据类型的方式typeofinstanceofconstructorObject下的toString.call()方法 闭包闭包的作用注意闭包的生命周期 body-parser for of和for in …

qsort函数

学习c语言的过程中少不了的就是排序&#xff0c;例如冒泡排序&#xff08;不清楚的同学可以翻找一下之前的文章&#xff09;&#xff0c; 我们这里将冒泡排序作为一个自定义函数来呈现一下 #include<stdio.h>void bubble_sort(int arr[], int len) {for (int i 0; i &…

【Vue】mutations

文章目录 一、定义mutations二、组件中提交 mutations三、带参数的 mutations 一、定义mutations mutations是vuex中的对象&#xff0c;这个对象可以定义在当前store的配置项中 const store new Vuex.Store({state: {count: 0},// 定义mutations// mutations是一个对象&#x…

自然语言处理(NLP)—— rasa的测试

1. 测试 Rasa NLU 模型 运行 rasa test nlu 命令会测试你的 Rasa NLU 模型。这个命令主要做以下几件事情&#xff1a; 1.1 意图识别测试 检查模型在识别用户意图方面的性能。这包括每个意图的准确率、召回率和 F1 得分。 1.2 实体提取测试 检查模型在识别和提取预定义实体方面…

为什么先遍历背包再遍历物品,求的是排列数;先遍历物品再遍历背包,求的是组合数?

完全背包问题简介 在完全背包问题中&#xff0c;每个物品可以被选择任意次。我们通常使用动态规划来求解这个问题&#xff0c;定义 dp[j] 为填满容量为 j 的背包的方法数。 先遍历背包再遍历物品&#xff08;排列数&#xff09; 先遍历背包再遍历物品的逻辑是&#xff1a;对…

Progressive Feature Fusion Framework Based on Graph Convolutional Network

以Resnet50作为主干网络&#xff0c;然后使用GCN逐层聚合多级特征&#xff0c;逐级聚合这种模型架构早已不新鲜&#xff0c;这篇文章使用GCN的方式对特征进行聚合&#xff0c;没有代码。这篇文章没有过多的介绍如何构造的节点特征和邻接矩阵&#xff0c;我觉得对于图卷积来说&a…

自动化Reddit图片收集:Python爬虫技巧

引言 Reddit&#xff0c;作为一个全球性的社交平台&#xff0c;拥有海量的用户生成内容&#xff0c;其中包括大量的图片资源。对于数据科学家、市场研究人员或任何需要大量图片资源的人来说&#xff0c;自动化地从Reddit收集图片是一个极具价值的技能。本文将详细介绍如何使用…

SCSS中的结构化伪类选择器详解与示例

SCSS&#xff0c;作为Sass的一种语法版本&#xff0c;是一种强大的CSS预处理器&#xff0c;它引入了许多便利的功能来增强CSS的编写能力。其中&#xff0c;:nth-child, :only-child, :first-child, :last-child, 和 :nth-last-child 是CSS选择器中的结构化伪类&#xff0c;它们…

Sass 使用指南:让 CSS 编程更高效、更强大

Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;是一种 CSS 预处理器&#xff0c;通过它&#xff0c;开发者可以使用变量、嵌套、混合和函数等更高级的功能来编写更简洁、更易于维护的样式代码。Sass 可以被编译成纯 CSS&#xff0c;使得你的项目能够在所有浏…

多个p标签一行展示,溢出隐藏

一开始&#xff0c;我是让div包裹多个p标签&#xff0c;并让div“flex”布局&#xff0c;且单行溢出隐藏&#xff0c;可是发现当父元素或当前元素有flex时&#xff0c;text-overflow: ellipsis;是不生效的 大多数解决办法都是&#xff0c;不要flex&#xff0c;或者给div下的每个…

【启程Golang之旅】网络编程与反射

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

Java进阶_多态特性

生活中的多态 多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作&#xff0c;如图所示&#xff1a; 现实中&#xff0c;比如我们按下 F1 键这个动作&#xff0c;同一个事件发生在不同的对象上会产生不同的结果。…

达梦8 探寻达梦排序机制之一:传统排序机制(SORT_FLAG=0)

测试版本&#xff1a;--03134283938-20221019-172201-20018 达梦的排序机制由四个dm.ini参数控制&#xff1a; SORT_BUF_SIZE 100 #maximum sort buffer size in MegabytesSORT_BLK_SIZE 1 #ma…