[STM32]关于环形队列的实现

2023-05-16

在程序中使用环形队列判断接收数据格式,避免在中断中处理造成程序响应速度慢的问题。

直接贴代码:

LoopRxCommu.h

#ifndef __LOOPRXCOMMU_H
#define __LOOPRXCOMMU_H

#include "hal_types.h"

 typedef struct{
	volatile u16 out;//环形队列头
	volatile u16 in;//环形队列尾(输入数据位置)
	volatile u8 *rbuf;//环形队列指针
	volatile u16 rxlen;//环形队列长度
	volatile u16 rxmsglen;//一帧消息长度
}tLoopDev;
 
int Loop_RxBufLen(tLoopDev *appuart);
u8 Loop_RxBufGet(tLoopDev *appuart,u16 uPos);
void Loop_RxBufPut(tLoopDev *appuart,u8 *pbuf, u16 len);
void Loop_RxFlush(tLoopDev *appuart);
void Loop_RxBufDel(tLoopDev *appuart,u16 uLen);
void Loop_RcvOneByte(tLoopDev *appuart,u8 byte);
#endif

LoopRxCommu.c

#include "LoopRxCommu.h"
#include "ucos_ii.h" 
#include <string.h>
/**************************************************************************
说明:  读环形BUF数据长度
**************************************************************************/
int Loop_RxBufLen(tLoopDev *appuart)
{
	register int length=0;
	length = appuart->in - appuart->out;
	if (length < 0)
		length += (appuart->rxlen);
	return length;
}

/**************************************************************************
说明:  读取到的字符
**************************************************************************/
u8 Loop_RxBufGet(tLoopDev *appuart,u16 uPos)
{
	return appuart->rbuf[((appuart->out + uPos) % (appuart->rxlen))];
}

/**************************************************************************
说明:  存入收到的字符
**************************************************************************/
void Loop_RxBufPut(tLoopDev *appuart,u8 *pbuf, u16 len)
{
	u16  i;

	for(i=0; i<len; i++)
	{
		appuart->rbuf[appuart->in] = pbuf[i];
		appuart->in++;
		if(appuart->in>=(appuart->rxlen))
			appuart->in=0;
	}
}

/**************************************************************************
说明:  清空数据
**************************************************************************/
void Loop_RxFlush(tLoopDev *appuart)
{
#if OS_CRITICAL_METHOD == 3
	OS_CPU_SR  cpu_sr;
#endif
	OS_ENTER_CRITICAL();

	appuart->in = 0;
	appuart->out = 0;
	//memset(appuart->rbuf,0xff,(appuart->rxlen));

	OS_EXIT_CRITICAL();
}
/**************************************************************************
说明:  删除接收缓冲区制定长度的字符
**************************************************************************/
void Loop_RxBufDel(tLoopDev *appuart,u16 uLen)
{
	uint16_t uRecvLen = Loop_RxBufLen(appuart);

	if (uLen <= uRecvLen)
	{
		appuart->out = (appuart->out + uLen) % (appuart->rxlen);
	}
	else
		Loop_RxFlush(appuart);
}

void Loop_RcvOneByte(tLoopDev *appuart,u8 byte)
{
	appuart->rbuf[appuart->in]=byte;
	appuart->in++;
	if(appuart->in>=(appuart->rxlen))
		appuart->in=0;
}

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

[STM32]关于环形队列的实现 的相关文章

  • C#垃圾回收GC机制

    https www cnblogs com yzl050819 p 6245463 html 可以参考这篇文章的内容 程序员不能控制解构器何时将被执行因为这是由垃圾收集器决定的 垃圾收集器检查不在被应用程序使用的对象 它认为这些条件是符合清
  • 编译xlslib 测试写入中文

    1下载xlslib库 https sourceforge net projects xlslib source 61 directory 我下载的是 xlslib package 2 5 0 zip 解压 在xlslib xlslib bu
  • 电商API:拍立淘图片搜索

    item search img 按图搜索淘宝商品 xff08 拍立淘 xff09 查看演示 onebound taobao item search img 请求参数 xff1a imgid 61 http g search3 alicdn
  • Qt的UI布局以及控件间隔(Spacing)边距(Margins)

    替一个Widget设置布局有两种方法 1layout 构造函数传递QWidget QVBoxLayout MainQVboxLayout 61 new QVBoxLayout MainWidget 2layout构造函数传递NULL xff
  • 让Qt自定义窗口边界可以拉伸

    qt去掉外边框以后 边界不能拉伸 第一 根据mouseevent事件到达边界的时候自己处理 通过resize 来设置 这种需要写的代码较多 windows平台上有更简版的方法 处理winevent里面的 WM NCHITTEST switc
  • 最新uboot的Kbuild系统 3 .config的生成

    前面的工作产生了一个conf 关键点是由conf产生 config的过程 最后是通过执行 scripts kconfig conf defconfig 61 arch configs rpi defconfig Kconfig 生成的 Kc
  • linux下IDA安装使用

    http www hexblog com p 61 958 sudo dpkg add architecture i386 sudo apt get update sudo apt get install libc6 i686 i386 l
  • RK3288的几种USB模式

    RK3288启动后有三种模式 xff0c 可以分别进行操作 一种是normal也就是正常的启动模式 这个模式无法刷固件 一般板子通电就是这个模式 第二种是loader模式 就是刷固件模式 这个模式可以刷各种image 按住recover按键
  • (导数)微分与积分的概念

    1导数定义 2微分 微分可以看作 y在自变量增量x 处在一个极小值deta x下的变化值的线性主部 微分指的是dy dy和deta Y有一个极小的增量也就是图5 9中的Q Q 39 xff0c 这一部分可以忽略不计 所以是微分 dy 是de
  • android sdk license问题

    You have not accepted the license agreements of the following SDK components Checking the license for package CMake 3 6
  • git还原某个文件到特定的版本

    转载自 https www cnblogs com qianxinxu p 7159739 html 场景 xff1a 对于某个Git控制下的文件进行了修改 xff0c 但是改的不满意 xff0c 想退回到改之前的版本 假定该文件为 src
  • frida初探1

    frida包括客户端和服务 服务运行在windows上面 通过Pip install frida安装 安装比较慢的话 直接下载frida 12 6 13 tar 执行 python setup py install 然后会要继续下载 fri
  • 常见PCB封装图解

    常用集成电路芯片封装图 doc文档可能在WAP端浏览体验不佳 建议您优先选择TXT xff0c 或下载源文件到本机查看 PCB 元件库命名规则 2 1 集成电路 xff08 直插 xff09 用 DIP 引脚数量 43 尾缀来表示双列直插封
  • visual studio 里面解决方案资源管理器界面不见了,应该如何显示出来?并且如何将其从右边更改到左边

    1 打开visual studio 软件 出现的界面没有 解决方案资源管理器界面 xff0c 如下图所示 xff1a 2 点击顶部的 视图 菜单 xff0c 如下图所示 xff1a 3 打开 视图 后 xff0c 会出现 解决方案资源管理器
  • 雾化器工作原理

    水位控制和偏置电路 电路中的超声换能器 xff34 xff24 xff08 又称雾化头 xff09 和其上 安装的两根水位控制触针 xff0c 他们是浸没在浅水水溶液中工作的 若长期雾化 xff0c 一旦液面降低而使雾化头的水位控制触针露出
  • 数据库复习笔记(全覆盖,包括往年部分真题)

    PS xff1a 大学开始写博客 xff0c 写了三年了 xff0c 虽然大二太忙了 xff0c 专业知识学的潦草 xff0c 也没写太多博客 大三开始写专业课的复习笔记 xff0c 没想到这一篇博文浏览和点赞这么高 xff0c 心里还是挺
  • 马原复习笔记(老师勾画的重点以及相应的习题练习)

    天呐 xff0c 我竟然会来复习马原 xff1f 那必须的 xff01 一心向党 xff0c 争做社会主义好青年 xff0c 当然了 xff0c 这玩意和思修 近代史不一样 xff0c 不记点东西编都不好编是吧 xff0c 加上和之前毛概不
  • zigbee通讯技术复习笔记

    这门课对于我一个学嵌入式的来说 xff0c 还是比较重要的 xff0c 所以我还是以老师给出的大纲为主体 xff0c 好好复习一下 xff01 题型 xff1a 选择题24x1 5 判断10x1 填空15x1 简答4x5 程序1x5 另外一
  • 第五天:了解越疆dobot机械臂,使用python,编写通过ros服务控制机械臂运动程序

    一 了解越疆dobot机械臂 详细信息可以查看用户手册和API开发手册 xff0c 以及其它官方提供资料 xff0c 这里我只列出我在开发过程中遇到的问题 xff0c 以及需要了解的知识点 xff08 1 xff09 坐标系 我们可以看到这
  • 毕设——基于人脸表情识别的桌面交互精灵设计(分享一下成果,附上人脸表情的数据集和自己训练出来yolov5模型以及基于PYQT5运行yolov5的交互界面)

    说明 xff1a 下载人太多 xff0c 网盘链接容易失效 xff0c 我放到了我的资源里面 xff0c 内容包括源代码和模型 xff0c 数据集还是通过网盘自取 xff01 CSDN资源链接 目录 一 前言二 说说论文三 说说设计本身四

随机推荐

  • 【嵌入式笔/面试】嵌入式软件基础题和真题总结——操作系统

    在学习的时候找到几个十分好的工程和个人博客 xff0c 先码一下 xff0c 内容都摘自其中 xff0c 有些重难点做了补充 xff01 才鲸 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linu
  • 【嵌入式笔/面试】嵌入式软件基础题和真题总结——网络相关

    在学习的时候找到几个十分好的工程和个人博客 xff0c 先码一下 xff0c 内容都摘自其中 xff0c 有些重难点做了补充 xff01 才鲸 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linu
  • 【嵌入式笔/面试】嵌入式软件基础题和真题总结——单片机与Linux

    在学习的时候找到几个十分好的工程和个人博客 xff0c 先码一下 xff0c 内容都摘自其中 xff0c 有些重难点做了补充 xff01 才鲸 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linu
  • 12、AD模数转换

    一 A D转换器的主要技术指标 1 分辨率 ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量 常用二进制的位数表示 例如12位ADC的分辨率就是12位 xff0c 或者说分辨率为满刻度的1 2 12 一个10V满刻度的
  • 安装了双系统,Ubuntu未显示WiFi连接,无法上网怎么办,以及windows无法上网怎么办

    我最近刚装了双系统 xff0c 但是当我登录上Ubuntu系统时 xff0c 却没有看到WiFi图标显示 xff0c 没法连接网络 于是输入下面命令进行操作 xff0c 就恢复了 大家可以参考一下 更新并激活网卡 xff1a 1 首先打开终
  • CMakeLists.txt中FIND_PACKAGE()是如何工作的?

    官方文档 xff1a https cmake org cmake help latest command find package html FIND PACKAGE lt PackageName gt 如何查找头文件和库文件路径 xff1
  • 头文件中应该写什么

    通 过上面的讨论 xff0c 我们可以了解到 xff0c 头文件的作用就是被其他的 cpp 包含进去的 它们本身并不参与编译 xff0c 但实际上 xff0c 它们的内容却在多个 cpp 文件中得到了 编译 通过 定义只能有一次 的规则 x
  • ubuntu下编译报错:对‘cv::String::deallocate()’未定义的引用

    在编译包含opencv头文件的程序时报错1 xff0c 如下 xff1a home jie cadmus ws devel lib libdeebot slam so xff1a 对 cv String allocate span clas
  • MDK软件仿真使用

    开始仿真前需要先配置环境 xff0c 如果手动创建环境不能进入仿真要考虑去看一下工程配置选项的问题 xff0c 本次仿真使用AT32F403VGT7型号 xff0c 如图 xff1a 点击开始仿真 xff0c 下面对仿真工具栏的选项进行具体
  • SK6812驱动入门

    我看数据手册一般是特性 引脚定义 外围电路 时序图以及驱动代码 特性 Top SMD内部集成高质量外控单线串行级联恒流IC xff1b 控制电 与芯片集成在SMD 3528元器件中 xff0c 构成一个完整的外控像素点 色温效果均匀且一致性
  • ESD与TVS的区别

    概念 ESD全称是Electro Static discharge 意思就是 静电释放 国际上习惯将用于静电防护的器材统称为ESD 中文名称为静电阻抗器 TVS全称是Transient Voltage Suppressor 意思是 瞬间电压
  • 开关电源三种控制模式:PWM/PFM/PSM

    1 PWM PFM PSM 三种控制模式的定义 通常来说 开关电源 xff08 DC DC xff09 有三种最常见的调制方式分别为 xff1a 脉冲宽度调制 xff08 PWM xff09 脉冲频率调制 xff08 PFM xff09 脉
  • PCB布线走直角或锐角问题研究

    首先需要说明的一点 xff0c 在正常布线的过程中还是要尽量避免布线走直角和锐角 这里只是研究深入下布线走直角或锐角会有多大的危害性 xff0c 结尾给出答案 无论是教科书还是公司的技术规范都会强调布线避免出现走直角和锐角 xff0c 不过
  • 磁珠基本原理

    概念 磁珠的全称为铁氧体磁珠滤波器 xff0c 是一种抗干扰元件 xff0c 主要功能是滤除高频噪声 xff0c 消除存在于传输线结构 xff08 电路 xff09 中的噪声 工作原理 磁珠通过阻抗吸收并以发热的形式将不需要频段的能量耗散掉
  • BUCK型DC-DC变换器

    前述 DCDC从控制手段上来说分为PWM式 谐振式以及他们的结合式 每 一种方式中从输入与输出之间是否有变压器隔离又可以分为有隔离 无隔离两类 每一类有六种拓扑结构 BUCK Boost BUCK Boost Cuk Sepic和Zeat
  • dubbo服务超时导致的异常org.apache.dubbo.remoting.TimeoutException

    1 dubbo服务超时异常提示信息如下 xff1a cause org apache dubbo remoting TimeoutException Waiting server side response timeout by scan
  • 基于TCP/IP实现串口到网络的通讯转换

    工作模式 通过串口服务器 xff0c 采集到天平的称量值发送到PC端 操作步骤 1 软件测试 测试工具 xff1a USR M0 V2 2 5 8 基础设置 xff1a 模块静态IP 设置成服务器IP xff0c HTTP服务端口 设置成4
  • 结构体的对其规则以及为什么要对其

    结构体的内存对齐规则以及为什么要对齐 内存对齐规则 span class token number 1 span 第一个成员在与结构体变量偏移量为 span class token number 0 span 的地址处 span class
  • 宏定义参数

    宏定义的参数以逗号 xff08 作为分隔符 span class token macro property span class token directive keyword include span span class token s
  • [STM32]关于环形队列的实现

    在程序中使用环形队列判断接收数据格式 xff0c 避免在中断中处理造成程序响应速度慢的问题 直接贴代码 xff1a LoopRxCommu h ifndef LOOPRXCOMMU H define LOOPRXCOMMU H includ