【STM32】STM32CubeIDE HAL库Ring-buffer例程

2023-05-16

板子G474RE。

STM32HAL库Ring-buffer使用。

//注意:HAL库中,中断每执行一次,就关闭,所以需要重新开启中断。第一次开启在main函数中。

HAL_UART_Receive_IT(&hlpuart1,LPUART1_temp,1);

/*注意:队列中数据并没完全删除,仅是被覆盖。HAL_UART_Transmit只能定长输出数据
         * buffer.num是输出数据的定长,所以重新初始化
         * 队列结构,重新准备接收新数据

*/
//printf 重定义

/* 阻塞判断串口是否发送完成 */
	 while((LPUART1->ISR & 0X40) == 0);

	 /* 串口发送完成,将字符发送*/
	 LPUART1->TDR = (uint8_t) ch;

踩坑一下午,看了很多文章。网上大部分都是固件库,HAL库某方面确实坑。

 

实现代码:两种都是数组实现缓存空间,几乎没什么区别。

起始:队尾指向同一个地方,插入数据(尾插法),尾指针动,读数据(头读法),顺序遍历。

注意:Ring-buffer,例如第一次插入5个数据,初始化后,再插入3个,数据前三个被覆盖,后面继续保留。造成空间浪费, 因为HAL库的原因(HAL_UART_Transmit函数只能定长发送数据)并没找到解决办法。

/*
 * _usart.c
 *
 *  Created on: Jun 18, 2020
 *      Author: guolunlun
 */
#include "user/_usart.h"


//extern uint8_t LPUART1_Rx_Buf[1024];
//extern uint8_t LPUART1_Rx_cnt;
//extern uint8_t LPUART1_Rx_flg;
//extern uint8_t LPUART1_temp[1];
//其它文件中引用
uint8_t LPUART1_Rx_Buf[1024] = {0}; //LPUART1存储接收数据
uint8_t LPUART1_Rx_flg = 0;                   //LPUART1接收完成标志
uint8_t LPUART1_Rx_cnt = 0;                   //LPUART1接受数据计数器
uint8_t LPUART1_temp[1] = {0};       //LPUART1接收数据缓存


#define RING
//#define ARRAY
//ring_buffer 定义缓冲区总长
#define  MAX_Array  200

//定义一个ring_buffer结构体
typedef struct

{
	uint16_t head;//缓冲区头部位置

    uint16_t tail;//缓冲区尾部位置

    uint8_t ringBuf[MAX_Array];//缓冲区数组
    uint16_t num;//缓冲区数组中数据个数

}ringBuffer_t;

/**************************系统回调函数********************************/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	//LPUART1串口
	if(huart->Instance==LPUART1)
	  {
#ifdef RING
		Ring_Buffer_Write(LPUART1_temp[0]);
#endif
#ifdef ARRAY
		//规定发送只有ACSII,接收的数据存起来,直到遇到换行或空格
		LPUART1_Rx_Buf[LPUART1_Rx_cnt] = LPUART1_temp[0];
		LPUART1_Rx_cnt++;
#endif
	    if(0x0a == LPUART1_temp[0]||LPUART1_temp[0]==0x20)
	    {//换行或空格符,结束
	    	LPUART1_Rx_flg = 1;//标志位置1
	    }

	    HAL_UART_Receive_IT(&hlpuart1,LPUART1_temp,1);
	    //中断每执行一次,就关闭,所以重新开启中断
	    //在main函数中,记得开启
	  }

}


//定义一个ring_buffer结构体对象
ringBuffer_t buffer;


void buffer_init(void){
	buffer.head=0;
	buffer.tail=0;
	buffer.num=0;
	//ring_buffer结构初始化
}
void _usart_test(void){

	if(LPUART1_Rx_flg)
	        {

#ifdef RING
	       Ring_Buffer_Read();

#endif
#ifdef ARRAY

	       	   	 HAL_UART_Transmit(&hlpuart1,LPUART1_Rx_Buf,LPUART1_Rx_cnt,0xff);
	          //终端回显发送接收到的数据

	        	memset(LPUART1_Rx_Buf,0x00,sizeof(LPUART1_Rx_Buf));//清空数组

	          	LPUART1_Rx_cnt = 0;//计数置零

#endif
	          	LPUART1_Rx_flg = 0;//标志位置零
	        }
}
/***************************/


uint8_t Ring_Buffer_Write(uint8_t data){

	if(buffer.num>=MAX_Array){
		return 1;
	}//判断是否溢出
	buffer.ringBuf[buffer.tail]=data;//从尾部增加数据,把数据存储在循环队列中
	buffer.tail=(buffer.tail+1)%MAX_Array;//尾部节点数据偏移
	buffer.num++;//记录循环队列中数据个数

	return 0;
}
uint8_t Ring_Buffer_Read(void){

	if(buffer.num==0){
		return 1;//队列是否为空
	}

	else{
		//输出队列中数据
		HAL_UART_Transmit(&hlpuart1,buffer.ringBuf,buffer.num,0xff);
		//printf("%d\n",buffer.num);
		printf("ARRAY test\n");
		buffer_init();//初始化队列结构
		/*注意:队列中数据并没完全删除,仅是被覆盖。HAL_UART_Transmit只能定长输出数据
		 * buffer.num是输出数据的定长,所以重新初始化
		 * 队列结构,重新准备接收新数据*/

		return 0;
	}
}

工程代码:

链接:https://pan.baidu.com/s/1c5WuIUx4O3OFR-YvQdHjaw 
提取码:sgop

 

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

【STM32】STM32CubeIDE HAL库Ring-buffer例程 的相关文章

  • Javascript fs.readFileSync 返回什么编码?

    考虑以下 Node js Javascript 程序 var fs require fs var encoding1 var encoding2 var a fs readFileSync testdoc pdf var b new Buf
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 如何获取以 Uint8Array 表示的图像的大小?

    我有一个用户头像图片的字节数组 它表示为键入的Unit8Array const imageBytes new Unit8Array 现在我需要检查图像大小以设置一些限制以防止用户放置大量图像 但我无法想出如何计算图像大小的想法 我该如何编写
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • 为什么 openGL glDepthFunc() 不起作用?

    我正在玩 openGL 我试图摆脱蓝色标记的三角形 我用这个代码 glEnable GL DEPTH TEST glDepthFunc GL LESS glEnable GL CULL FACE 是的 我用 glClear GL COLOR
  • 保护字符串缓冲区免受两个线程的影响?

    我正在通过 Indy 套接字处理流数据包字符串 在客户端 我有一个线程从TIdTCPClient并将这些数据连续附加到单个字符串缓冲区的末尾 我有另一个线程从头开始连续读取该缓冲区 根据需要复制 和删除 数据 一次一个完整的数据包 我知道在
  • Log4Net 中 AdoNetAppender 中的缓冲区的惰性评估

    我正在使用 Log4Net 自定义属性将一些环境信息添加到我的日志中 我创建了一个具有全局可访问属性的实用程序类 我的程序类使用它来存储上下文信息 订单 id 用户 id 等 以及围绕它们的惰性包装器 因此我不需要一直更改 Log4Net
  • 使用 WCF 流上传文件,从流中进行微小读取

    我已经使用WCF的流实现了文件上传 一切都按预期进行 但是我遇到了一个问题 我分配 4kb 缓冲区来从传入流中读取数据 但 WCF 仅读取 255 字节 这是我的上传功能 public UploadResponse UploadFile F
  • 获取网页时,如何在 Ruby 中捕获“处理过程中的错误:缓冲区错误”?

    我正在使用 Rails 4 2 7 和此代码通过 SOCKS 代理获取网页 begin res1 Net HTTP SOCKSProxy 127 0 0 1 50001 start uri host uri port do http put
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • kivy:可以使用缓冲区作为图像源吗?

    我有如下代码 它可以从一些现有图像中生成新图像 from PIL import Image as pyImage def create compound image back image path fore image path fore
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 将响应缓冲区转换为 JSON

    在 AWS 中 我使用 https 模块通过 Lambda 发出 get 请求 我能够返回数据 但当我调用时它是缓冲区格式的callback null obj https get options res gt res on data d g
  • 0x0A 和 0x0D 之间的区别

    我正在研究蓝牙 我试图编写代码以在连接时继续监听输入流 我遇到了以下代码片段 int data mmInStream read if data 0x0A else if data 0x0D buffer new byte arr byte
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • Clojure/Ring:使用环码头适配器,大请求会给我一个 413: FULL HEAD 错误。

    使用 Ring 的 Jetty 适配器 如果我的请求太大 我会收到 413 FULL HEAD 错误 我追踪到一个名为 headerbuffersize 的属性 但是当我尝试在 run jetty 调用中设置它时 我仍然得到 413 有没有
  • System.Reactive:基于时间戳字段的基于时间的缓冲区

    我在 C 项目中使用 Reactive 库根据配置的策略对数据进行分组 所有这些数据都实现了以下接口 public interface IPoint object Value get DateTimeOffset Timestamp get
  • 金属着色语言 - 更改缓冲区大小

    是否可以在运行时更改缓冲区大小 我们在注册期间分配缓冲区大小device device MTLCreateSystemDefaultDevice queue device makeCommandQueue do let library de
  • MacVim:跨窗口共享命名寄存器?

    我想跨 MacVim 窗口共享命名寄存器缓冲区 就像我在单个实例中跨缓冲区一样 换句话说 假设我标记了一个位置 m 然后去其他地方 我将一些文本拉入寄存器 a 从当前点到 m a m 然后我转到另一个窗口 不 我不是指同一窗口中的另一个分割
  • 如何使用 apache2 和 mod_proxy_fcgi 禁用缓冲?

    我在 debian Jessie 上使用 mod proxy fcgi 和 apache 2 4 以及我的 C 应用程序 该应用程序使用 libfcgipp 执行 ServerSentEvents 我的问题是 apache 仍然缓冲我的响应

随机推荐

  • 树莓派 3B+ 蓝牙无法使用问题

    最近想用树莓派3B 43 做个小玩意 xff0c 结果发现蓝牙功能不可用 xff0c 图标消失且不能发现设备 xff0c 几乎试了网上所有方法都不行 最后参考了这个帖子恢复了蓝牙功能 xff1a SOLVED Bluetooth icon
  • 电源管理芯片之 Regulator用法。

    有问题请加 xff1a Q群 xff1a 241359063 共同走向创业学习之旅 原创 xff1a kylin zeng http blog chinaunix net uid 23795897 html 转载请注明原创出处 xff0c
  • 如何查看ssh登录日志信息

    less var log secure grep 39 Accepted 39 正常登录日志信息 正常退出 密码错误登录 三次密码登陆失败 输入密码时 xff0c 主动退出 为了安全期间 xff1a 我们只允许xxx xxx xxx xxx
  • C语言笔记-25-网络-TCP网络编程

    C语言笔记 25 网络 TCP网络编程 文章目录 C语言笔记 25 网络 TCP网络编程前言一 TCP编程模型概括二 inet工具htonlinet pton 三 TCP编程模型代码TCP服务端TCP客户端 总结 前言 自学笔记 xff0c
  • Failed to load nodelet [/camera/realsense2_camera] of type [realsense2_camera/RealSenseNodeFactory]

    输入 xff1a roslaunch realsense2 camera rs rgbd launch 报错 xff1a 报错原因 xff1a 是找不到realsense2 camera包 xff0c 在安装D435的包时 xff0c 以为
  • 十七、基于软核和CAN搭建FPGA在线升级系统设计

    1 系统搭建 系统主要包含 xff1a MicroBlaze软核处理器 xff0c Axi Can控制器 xff0c Axi lite user用户通信接口 xff0c MIG DDR3控制器 xff0c 中断控制器等 设计使用Can接收上
  • 【OpenCV】cv::Mat位深和通道,CV_8UC1等

    位深 每个像素由多少位来存储 是一个精度问题 xff0c 一般图片是8bit xff08 位 xff09 的 xff0c 则深度是8 通道 每个像素点能存放多少个数 类似于RGB彩色图中的每个像素点有三个值 xff0c 即三通道 一个图像的
  • darknet_ros编译报错以及在RVIZ中显示乱码

    最近在arm平台上部署 darknet ros 出现了一些错误 xff0c 这里记录一下 首先在ARM平台上部署和在AMD平台上部署是不同的 xff0c 首先应该考虑算力问题 xff0c 在ARM下 xff0c 加载yolov3 weigh
  • 萌新改代码系列(一)--VINS+GPS

    VINS与GPS组合 距离上次写博客过去了快一年了 xff0c 这一年来我一直忙于与SLAM方向几乎没有关系的科研工作 xff0c 说来惭愧 xff0c 最终也没研究出个啥 最近得空 xff0c 就把我之前开源的代码整理了一下 xff0c
  • GVINS论文阅读(VINS-MONO + gnss 紧耦合)

    原文 x1f517 https arxiv org pdf 2103 07899 pdf github x1f517 https github com HKUST Aerial Robotics GVINS 港科大 沈老师团队 在vins
  • 萌新学VINS-Fusion(一)------特征跟踪

    VINS FUSION代码心得 新人小白 xff0c 第一次写博客 xff0c 主要相当于自己做一个关于学习VINS的笔记 xff0c 不喜勿喷 xff0c 转载请注明出处 其实我之前也尝试着在VINS MONO基础上改写双目的 xff0c
  • 萌新学VINS-Fusion(二)------初始化

    最近在忙别的事情 xff0c 博客迟迟没更新 xff0c 现在终于放假了 xff0c 今天把初始化部分来分析一下 源码 xff1a https github com HKUST Aerial Robotics VINS Fusion pro
  • c 语言中 %d,%lu等区别

    转载至 xff1a http blog sina com cn s blog 7d94c35c01019f96 html d 有符号10进制整数 ld 长整型 hd短整型 hu 无符号短整形 u无符号整形 lu无符号长整形 i 有符号10进
  • 萌新学VINS-Fusion(三)------双目和GPS融合

    虽然要过年了 xff0c 而且每天还要在家里小店打工 xff0c 但是网红之路不能停对吧 xff0c 这篇博客写关于VINS Fusion和GPS的融合 其实我之前改出过一个加了GPS的VIO xff0c 并且也开源了 xff0c 之前没有
  • nuxt cookie-universal-nuxt 搭配 vuex-persistedstate 做数据持久化

    前言 因为服务端不存在 Local Storage 和 Session Storage 所以 便使用了 cookie universal nuxt 这个插件 在做Nuxt项目的时候 发现Vuex 在刷新页面后 储存的数据丢失 用 vuex
  • ROS学习(一):Navigation中GNSS与IMU数据融合定位

    1 参考博客 主要参考以下博客 感谢各位博主的分享 link https blog csdn net qinqinxiansheng article details 107108475 utm medium 61 distribute pc
  • msOS学习之路(1)

    msOS学习之路 xff08 1 xff09 1 msOS的初步认识 刚刚拿到msOS开发板的时候 xff0c 看了一下开发板 xff0c 感觉非常高端 xff0c 再看一下芯片 xff0c 用的是stm32 当时我就觉得我得先学习stm3
  • msOS学习之路(2)

    基于msOS自动回火机的实现 1 简介 1 1 背景 基于msOS自动回火机的实现的实例是学习msOS比较好的入门实例 xff0c 它包括msOS界面的设计 数据库的使用 系统节拍的使用 按键的使用 系统节拍使用等 xff0c 通过这个例子
  • msOS学习之路(4)

    设备层简单理解 1 设备层相关定义 设备层的相关定义是在device h文件中定义的 xff0c 包括按键 模拟量输入 数字量输入 输出枚举或者类型定义等 xff0c 对于一些结构体的理解 xff0c 例如 xff1a ADC结构体 xff
  • 【STM32】STM32CubeIDE HAL库Ring-buffer例程

    板子G474RE STM32HAL库Ring buffer使用 注意 xff1a HAL库中 xff0c 中断每执行一次 xff0c 就关闭 xff0c 所以需要重新开启中断 第一次开启在main函数中 HAL UART Receive I