ESP8266 控制之 : 使用 RingBuffer USART1 和 USART3互传

简介

使用Buffer来避免数据的丢失, 或许你自己在使用串口进行收发时会丢失数据,
现在我们就来简单使用一下RingBuffer创建Rx、Tx的Buffer来避免发送接收丢包或数据丢失问题。

扩展知识

RingBuffer的介绍, 看完大概也就知道了,实在不知道就看看下面的代码

线路连接

粗略描述

USART1 接 USB转TTL线到PC
USART3 接 ESP8266

实物

在这里插入图片描述

步骤

使用到的库

WKJay 的 RingBuffer

使用STM32CubeMX创建项目

参考 普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)

初始化串口1 和 串口3

USART1 和 USART3初始化一样
在这里插入图片描述

添加用户代码

/* 定义ringbuffer全局变量, rb_usart1_rx/rb_usart3_rx 是USART1和3的接收Buffer, tx则是发送Buffer*/ringbuffer_t rb_usart1_rx, rb_usart3_rx, rb_usart1_tx, rb_usart3_tx;uint8_t buffer_usart1_rx[512], buffer_usart3_rx[512], buffer_usart1_tx[512], buffer_usart3_tx[512];/* 串口中断代理 */
void USART_isr(UART_HandleTypeDef *huart, ringbuffer_t *ringBuffer_rx, ringbuffer_t *ringBuffer_tx)
{uint32_t isrflags   = READ_REG(huart->Instance->SR);uint32_t cr1its     = READ_REG(huart->Instance->CR1);if ((isrflags & USART_SR_RXNE) && (cr1its & USART_CR1_RXNEIE)) {huart->Instance->SR;ringbuffer_putchar(ringBuffer_rx, huart->Instance->DR);return;}if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET)){uint8_t ch;if (ringbuffer_getchar(ringBuffer_tx, &ch) == 0) {huart->Instance->SR;huart->Instance->DR = ch;}else{__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);}return;}
}/* USART1中断处理函数 */
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */UART_HandleTypeDef *huart = &huart1;USART_isr(huart, &rb_usart1_rx, &rb_usart1_tx);/* USER CODE END USART1_IRQn 0 *//* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}
/* USART3中断处理函数 */
void USART3_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */UART_HandleTypeDef *huart = &huart3;USART_isr(huart, &rb_usart3_rx, &rb_usart3_tx);/* USER CODE END USART1_IRQn 0 *//* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}int main(void)
{...ringbuffer_init(&rb_usart1_rx, buffer_usart1_rx, sizeof(buffer_usart1_rx));ringbuffer_init(&rb_usart3_rx, buffer_usart3_rx, sizeof(buffer_usart3_rx));ringbuffer_init(&rb_usart1_tx, buffer_usart1_tx, sizeof(buffer_usart1_tx));ringbuffer_init(&rb_usart3_tx, buffer_usart3_tx, sizeof(buffer_usart3_tx));__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); // USART1接收中断打开__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);// USART3接收中断打开while(1){uint8_t ch;/* 从 usart1的接收buffer中取数据, 放到usart3的发送buffer中, 并开启usart1的发送中断  */if (ringbuffer_getchar(&rb_usart1_rx, &ch) == 0) {ringbuffer_putchar(&rb_usart3_tx, ch);__HAL_UART_ENABLE_IT(&huart3, UART_IT_TXE);}/* 从 usart3的接收buffer中取数据, 放到usart1的发送buffer中, 并开启usart1的发送中断 */if (ringbuffer_getchar(&rb_usart3_rx, &ch) == 0) {ringbuffer_putchar(&rb_usart1_tx, ch);__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);}}...
}

共赏

在这里插入图片描述

Note:
某些地方可以做些优化,部分数据传递可以使用指针!

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

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

相关文章

使用antdesign3.0、echarts制作固定资产后台管理系统原型

学了半个月Axure,周末用半天时间,照着网上的模板做了一个固定资产后台管理系统的原型。重点是内联框架的使用,和对echarts表格js代码的调试。原型链接:https://qoz5rv.axshare.com 资产管理系统

SD NAND的CLK引脚的注意事项和走线规范

CLK的作用和注意事项 SD NAND的时钟引脚(CLK)的作用是提供一个时钟信号,用于同步数据传输。时钟信号是由主设备(如微控制器或存储控制器)提供的,用于确保SD NAND和主设备之间的数据交换是按照相同的时序进…

力扣hot100 子集 回溯 超简洁

Problem: 78. 子集 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) Code class Solution {List<Li…

【Javaweb程序】【C00155】基于SSM的旅游旅行管理系统(论文+PPT)

基于SSM的旅游旅行管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于SSM的旅游旅行管理系统 本系统分为前台系统模块、管理员模块、用户模块以及商家模块 其中前台系统模块的权限为&#xff1a;当游客打开系统的网址后…

Docker本地部署APITable结合内网穿透实现公网访问

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c;是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

luceda ipkiss教程 60:导入特定图层的GDS版图

在用GDSCell导入版图时&#xff0c;可以设置layer_map来选择导入特定图层的GDS文件&#xff0c; 比如&#xff1a;可以将教程57中的微环调制器生成gds文件&#xff1a;Ring_modulator.gds&#xff0c; 在导入Ring_modulator.gds做其他设计时&#xff0c;可以选择只导入波导部分…

高阶测试开发必备技能: k8s入门!

现在稍微有点规模公司都是基于docker容器化部署技巧&#xff0c;K8s现在主流&#xff0c;应用最广的容器集群管理技术。 k8s全称kubernetes&#xff08;首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s&#xff0c;所以简称 k8s&#xff09;&#xff0c;基于Docker容器…

网络安全01--负载均衡

目录 一、环境准备 1.1三台虚拟机 二、开始搭建负载均衡&#xff1a; 2.1准备一下源 2.2正式安装 2.3Nginx安装情况 三、负载均衡--轮询&#xff08;round robin&#xff09; 3.1在 http 部分添加如下负载均衡配置&#xff1a; 3.2简单解释一下server端&#xff1a; …

JS-Window常见对象

location对象 location的数据类型是对象&#xff0c;它拆分并保存了URL地址的各个组成部分 常用属性和方法&#xff1a; 1&#xff09;href属性获取完整的URL地址&#xff0c;对其赋值时用于地址的跳转 //可以得到当前文件URL地址 console.log(location.href) //可以通过js…

GPT-SoVITS 测试

开箱直用版&#xff08;使用 AutoDL&#xff09; step1 打开地址 https://www.codewithgpu.com/i/RVC-Boss/GPT-SoVITS/GPT-SoVITS-Official 选择 AutoDL创建实例&#xff0c;选择 3080ti 机器 step2 创建好实例之后&#xff0c;进入命令行&#xff0c;输入命令 echo {}>…

防御保护--智能选路

目录 就近选路 策略选路--PBR DSCP优先级 智能选路--全局路由策略 1.基于链路带宽的负载分担 2.基于链路质量进行负载分担 3.基于链路权重进行负载分担 4.基于链路优先级的主备备份 ​编辑 DNS透明代理 就近选路 我们希望在访问不同运营商服务器时&#xff0c;通过对…

使用机器学习算法检测交易中的异常行为

交易中的异常检测意味着识别交易或相关活动中的异常或意外模式。这些模式被称为异常或异常值&#xff0c;明显偏离预期规范&#xff0c;可能表明存在不规则或欺诈行为。 异常检测在各种业务中发挥着至关重要的作用&#xff0c;尤其是那些涉及金融交易、在线活动和安全敏感操作…

TensorFlow Lite中文本分类在Android上的实践

#1 Tensorflow Lite TensorFlow Lite(后续简称TFL) 是 Google 开发的一个用于移动设备和嵌入式设备的开源库,旨在为移动终端设备提供机器学习推断。它是 TensorFlow 框架的轻量级版本,专门优化了模型的大小和性能,以适应资源受限的移动设备和嵌入式系统。 TFL 提供了一种在移…

go包与依赖管理

包&#xff08;package&#xff09; 包介绍 Go语言中支持模块化的开发理念&#xff0c;在Go语言中使用包&#xff08;package&#xff09;来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件&#xff08;.go结尾的文件&#xff09;组成&#xff0c;是一种高级的代码…

LiveGBS流媒体平台GB/T28181功能-支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务

LiveGBS功能支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务 1、配置开启HTTPS1.1、准备https证书1.1.1、选择Nginx类型证书下载 1.2、配置 LiveCMS 开启 HTTPS1.2.1 web页面配置1.2.2 配置文件配置 2、验证HTTPS服务3、为什么要开启HTTPS3.1、安全性要求3.2、功能需求 4、搭…

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料…

uniapp 解决键盘弹出页面内容挤压问题

page.json 配置 加 “app-plus”: { “softinputMode”: “adjustResize” } {"path": "pages/jxx/xx","style": {"navigationBarTitleText": "贺卡DIY","enablePullDownRefresh": false,"app-plus": {…

IndexedDB入门

https://www.cnblogs.com/zhangzuwei/p/16574791.html 注意 1.删除表&#xff0c;创建表只能在数据库版本升级里面进行。 2.keyPath: key 要和表字段对应&#xff0c;而且格式要一样&#xff0c;不然不运行不报错。 3.使用 autoIncrement: true 代替 keyPath: key&#xff…

怎么把png格式图片存储到二维码中?图片的二维码生成方法

随着二维码的广泛应用&#xff0c;越来越多的人开始探索如何将不同格式的图片与二维码相结合&#xff0c;以实现更丰富、更有吸引力的信息传递方式。在这个过程中&#xff0c;PNG格式的图片作为一种常见的无损压缩图像格式&#xff0c;被广泛应用于网络、移动应用和数字媒体等领…

深入解析HTTPS:安全机制全方位剖析

随着互联网的深入发展&#xff0c;网络传输中的数据安全性受到了前所未有的关注。HTTPS&#xff0c;作为HTTP的安全版本&#xff0c;为数据在客户端和服务器之间的传输提供了加密和身份验证&#xff0c;从而确保了数据的机密性、完整性和身份真实性。本文将详细探讨HTTPS背后的…