STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能

2023-05-16

STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能

0 实验背景

本实验的目的是实现串口的双向转发,即向串口1写入数据后,串口2及时输出串口1收到的数据;向串口2写入数据后,串口1及时输出串口2收到的数据。

1 实验硬件平台

本实验基于STM32G070RBT6单片机实验,查询参考手册《RM0454 STM32G0x0 advanced Arm-based 32-bit MCUs》可知,该单片机具有接收缓存非空和空闲中断功能,为了保持程序的通用性,特地查阅了stm32f10x系列单片机的参考手册《RM0008》,可以STM32F10X单片机同样具有这两个中断,即本实验可以轻松应用与stm32f10x系列单片机。

图  1‑1 《RM0454 STM32G0x0 advanced Arm-based 32-bit MCUs》中串口中断表

图  1‑2 《RM0008 STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®-based 32-bit MCUs》中串口中断表

2 实验软件平台

本次实验的软件平台为STM32CubeIDE 1.7.0.

创建工程时选择STM32G070RB单片机。

使用CubeIDE集成的CubeMX配置工具配置引脚,本次使用原则上使用两个串口可以实现串口转发功能。

本次实验使用串口1和串口3做转发实验,串口1,PA10为接收引脚,PA9为发送引脚;串口3,PD9为接收引脚,PD8为发送引脚。

引脚配置如下图:

图  1‑3 串口转发引脚配置

3 实现原理

3.1 接收原理

整个接收过程发生在后台系统中,即中断函数中。

在发生接收缓存非空时(RXNE)进入中断函数将数据保存到缓存中,接收长度加一,同时启用串口空闲中断。

当空闲中断发生时,标记本组接收完成,组变量自增一并取余保持环形缓存的循环使用。

3.2 转发原理

转发过程发生在前台系统中,即while(1)循环中,通过不断检查缓存使用标记实现。

如果判断已经接收完成,则调用其他串口发送,等发送完成后清除数据长度,增加判断的组号变量。

4 工程创建与串口配置

使用stm32CubeIDE选择stm32g070rb单片机创建基础功能,使用串口1和串口3,注意使能串口后注意串口硬件是否和预期一致,如过不一致需要修改。

两个串口均使用默认配置,即波特率115200,8,n,1;

图  2‑1 串口默认配置

在NVIC配置中勾选使用中断。

在NVIC的Code generation中不勾选 Generate IRQ handler,即不让CubeMx自动生成中断函数,我们自己编写串口中断函数。

5 编写串口接收缓存结构体

定义两个宏,一个定义单个数组缓存的大小,一个定义数组个数。

// 定义接收缓存的最大长度为 256

#define RING_BUFF_MAX_LENGTH (256)    

// 定义缓存个数

#define RING_BUFF_MAX_BUFF_COUT (3)   

数据接收缓存数据结构定义:RING_BUFF数据结构有三个成员,第一个是unsigned char类型的数组,用于存放接收到的数据;第二个是unsigned shot int 类型的数据变量,用于记录接收到的数据长度;第三个是用于标记该缓存是否接受到数据的标识符0,表示未使用或正在接收中;大于零的其他值表示接收完成。

// 缓存 结构体

struct RING_BUFF

{

   // 数据接收缓存数组

   uint8_t buff[RING_BUFF_MAX_LENGTH];

   // 接收到的数据长度

   uint16_t length ;

   // 缓存使用标记,0,为使用或正在接收中;大于零的其他值, 接收完成;

   uint16_t usedFlag;

};

定义接受缓存:

本实验中使用量环形缓存队列的编程想法,对串口1和串口3分别定义三组接受缓存,当第1组接受完成时,自动自己接收完成标记,有新数据时自动记录到下一组缓存中;读取时也是同样,先读取第一组标记位,有数据时用相应的串口做转发,读取完成后清除标记位,接着读取下一个缓存的标记。

因此,除了定义接收缓存为,还需要一个全局变量用于标记当前使用的缓存组号。

// 串口1 缓存组好记录

uint8_t jlinkRxBuffArrNum = 0;

// 串口3 缓存组好记录

uint8_t rs232RxBuffArrNum = 0;

6 串口中断函数编写

 

7 数据接收完成查询与转发功能编写

这里为了简化,创建了两个freeRTOS的task,效果等同于无操作系统下的while(1)循环。

 

8 通信测试

一个发送ABCDEFG,一个发送987654321.

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

STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能 的相关文章

  • Linux命令发送Http的get或post请求(curl和wget两种方法) 及定时任务的设置

    Http请求指的是客户端向服务器的请求消息 xff0c Http请求主要分为get或post两种 xff0c 在Linux系统下可以用curl和wget命令来模拟Http的请求 下面就来介绍一下Linux系统如何模拟Http的get或pos
  • ROS path问题解决方案

    1 问题描述 1 1 在Roboware里面直接右键运行launch文件会出现如下错误 ResourceNotFound hector gazebo worlds ROS path 0 61 opt ros kinetic share ro
  • ubuntu下socket通信

    点击打开原文链接 第一部分为C 43 43 实现 xff0c 第二部分为python实现 第一部分 该socket 的功能是在客户端输入了两个浮点数组成的字符串 xff0c 在服务端接受后将其转换为浮点数输出 xff0c 统一时刻只能有一个
  • ZED相机深度模式+ZED sl中函数介绍

    ZED SDK提供两种深度感应模式 xff1a STANDARD和FILL 该STANDARD模式是ZED的默认深度感应模式 该STANDARD模式保留距离度量和形状 xff0c 并且比FILL模式运行得更快 xff0c 但它包含由于视觉遮
  • 串行通信的数据位,起始位,停止位?

    参考链接 单片机串口通信一般是11位 xff0c 起始位1bit xff0c 数据位8bit xff0c 校验位1bit xff0c 停止位1bit xff0c 串口通信分两种一种是同步通信 xff0c 一种是异步通信 xff0c 像ps
  • linux的UDP通信编程

    这篇文章将对linux下udp socket编程重要知识点进行总结 xff0c 无论是开发人员应知应会的 xff0c 还是说udp socket的一些偏僻知识点 xff0c 本文都会讲到 尽可能做到 xff0c 读了一篇文章之后 xff0c
  • UDP组播服务端与客户端代码实例

    1 组播服务端代码 xff08 数据发送端 xff09 include lt stdio h gt include lt stdlib h gt include lt stdbool h gt include lt string h gt
  • HTTP报文

    HTTP请求报文解剖 http请求报文由3部分组成 xff08 请求行 请求头 请求体 xff09 实际请求报文 是请求方法 xff0c GET和POST是最常见的HTTP方法 xff0c 除此以外还包括DELETE HEAD OPTION
  • IMX6ULL与STM32F103的CAN通信实现

    IMX6ULL与STM32F103的CAN通信实现 硬件连接驱动层实现IMX6ULLSTM32F103ZET6 应用层实现IMX6ULLSTM32F103ZET6 结果 在上一篇博文中 xff0c 我们利用USBCAN设备及其上位机软件 x
  • linux-can编程(一)

    建立can的socket int can create socket char name int fd struct sockaddr can addr struct ifreq ifr socklen t len 61 sizeof ad
  • RTKLIB软件介绍

    转载自南京信息工程大学遥感与测绘工程学院的赵乐文老师的网课 xff08 来源 xff1a B站 xff09 开源GNSS数据处理软件介绍 RTKLIB下载 xff1a http www rtklib comCSDN里的资源 xff1a 快速
  • 将rtklib移植到树莓派

    在Raspberry Pi上构建RTKLIB CUI 材料 xff1a 树莓派4b xff0c NEO M8T 配置参考 这次实验主要相对RTKLIB进行尝试 xff0c 将rtkrcv移植到树莓派上 构建RTKRCV xff08 生成RT
  • 开发中常用的快捷键

    前言 常见的快捷键可以帮助程序员脱离鼠标的束缚 xff0c 提升效率 当然 xff0c 最重要的是可以装逼 Keyboard shortcuts I often use Windows Ctrl 43 Number ALT 43 Esc 使
  • 顶级程序员都在用哪些网站?

    前言 在这里给大家分享一点非常高质量的学习资料和工具网站 欢迎大家留下精彩的网站 xff0c 也可以是生活的 商业的等等 目录 高质量免费在线书籍高质量算法网站开源社区网站在线工具源码查找容器化技术 还有很多 将不定期更新 高质量免费在线书
  • ❤️Python是一个业余的编程语言吗?❤️

    x1f47e 前言 作为一个在python国内还很小众的时候就开始玩Python了 我知道有大佬是2013年就玩的很溜了 xff0c 麻烦让我装个逼 不过Python正渐渐退出了我的主力语言 xff0c golang c rust可能是未来
  • 一文讲清SSL协议

    OSI七层模型 计算机网络的OSI七层模型和TCP IP四层模型想必大家都知道 其中SSL TLS是一种介与于传输层 xff08 比如TCP IP xff09 和应用层 xff08 比如HTTP xff09 的协议 它通过 34 握手协议
  • 闭包详解(Python为例)

    不能简单讲 xff0c 这就要看一些底层的东西 堆栈结构等等 xff0c 估计还和编译原理有关 xff0c 我觉得重点在于延迟绑定怎么知道绑定的外层函数的局部变量 python的闭包是延迟绑定 什么是闭包 出现函数嵌套 即外层函数嵌套内层函
  • c++中函数只声明,不定义(不调用该函数)可以通过编译并运行

    c 43 43 中函数只声明 xff0c 不定义 xff0c 代码中也没有该函数的调用 xff0c 可以编译并运行 xff08 vs2015 xff09 Author gtkiller Date 2018 03 19 include lt
  • RMI的基础原理

    背景 上世纪90年代 焦点转移到跨平台通信 一台计算机可以通过某种类型网络在另一台计算机上发起一个动作 CORBA DCOM Java RMI 技术等等 xff0c 到现在的grpc等 Hello span class token keyw
  • 一次因修改Python编码规范而引起的“血案“

    简单来说就是因为如下代码 导致了ZipOutputPath的一个函数异常 导致zip包不能正确下载 有如下报错 UnboundLocalError local variable 39 val 39 referenced before ass

随机推荐

  • Python之禅(The Zen of Python)源码分析

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 该从什么开始 思来想去 我觉得作为一个Python初学者还是Pytho
  • Linux常用命令速查表

    目录即文件 dev null 等价于只写文件 所有写入它的内容都会永远丢失 而尝试从它那儿读取内容则什么也读不到 禁止标准输出 cat filename gt dev null 文件内容丢失 xff0c 而不会输出到标准输出 禁止标准错误
  • git常用命令速查表

    这是一些比较常用的命令 大家可以复制后用typora做成pdf格式 xff0c 方便快速查询 后续不定期更新 官方文档 官方文档 https git scm com docs 本地文档 file D cmder vendor git for
  • python开发中的常用命令

    这是一些比较常用的命令 大家可以复制后用typora做成pdf格式 xff0c 方便快速查询 后续不定期更新 pip升级 pip package installer for python use pip to install package
  • Python手写一个Base64编解码工具

    这里我们只实现标准的base64 补充位用 61 填充 编码 下面是base64字符的对照表 因为base64编码是将6bit表示成8bit 所以在原来的基础上会增长1 3 另外2 6 61 64 xff0c 这也是为什么这个表会有64个索
  • Python彩蛋源码分析(二)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 hello world hello world hello pytho
  • Python源码剖析专栏总览

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 将会分析一些源码的构思设计以及这些工具的使用方法 彩蛋篇 Easter
  • maven笔记小抄

    settings xml settings xml位置 标签指定本地下载的依赖在本地的保存位置 user home m2 repository表示C Users username m2 settings xml idea中File Sett
  • linux 下 tcpdump 详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • Python字节码分析(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 Pyc文件 简介 当在文件被当成模块导入时才会生成pyc文件 pyc文
  • Python基本类型(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 basic data types in python Python中的
  • xmlrpc源码解读(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 将会分析一些源码的构思设计以及这些工具的使用方法 一个简单的RPC实例
  • Python代码整洁之道勘误

    简介 本博文是对 lt Python代码整洁之道 gt 一书的一些错误进行矫正 这本书英文名字是 lt Clean Python Elegant Coding int Python gt 这本书的作者是Sunil Kapil 这本书错误非常
  • 自己动手写strcat函数

    char catstr char a char b char x 61 a while a 61 39 0 39 a 43 43 while b 61 39 0 39 a 61 b a 43 43 b 43 43 a 61 39 0 39
  • 为什么C++开发不需要安装STL库

    如果交叉编译工具链的路径已经添加到path变量中的话 xff0c 可以直接使用 v即可查看 xff0c 比如我的是arm linux gnueabihf g 43 43 那么直接arm linux gnueabihf g 43 43 v或者
  • 为什么要内存对齐

    为什么要内存对齐 xff1f 很多CPU是从对齐的地址开始加载数据 xff0c 外部总线从内存一次获取的数据往往不是1比特 xff0c 而是4比特或8比特或更多 xff0c 与数据总线带宽有关 比如有一个int数据类型 xff0c 其分配的
  • marlin2.0.x 固件相关配置文档说明

    主要目的 了解对应参数的作用 xff0c 以优化3D打印机的打印效果 具体分析 配置文件有两个 Configuration h 包含硬件核心 语言和控制器的设置 xff0c 以及最常见的功能和组件的设置 xff0c 主要配置的地方 Conf
  • c++容器--vector deque list set map stack queue特性及其选取准则

    1 vector xff08 连续的空间存储 可以使用 操作符 xff09 快速的访问随机的元素 xff0c 快速的在末尾插入元素 xff0c 但是在序列中间岁间的插入 xff0c 删除元素要慢 xff0c 而且如果一开始分配的空间不够的话
  • 网络、串口之应用层通讯协议编订

    一种二进制通信协议 消息长度 BYTES 结构描述Header4SyncBytes格式 xff1a 0x09 0x6f 0x01 0x01 xff0c 表示不同设备之间的交互Header4FullMessageLength数据总长度 xff
  • STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能

    STM32基于串口接收缓存非空中断 xff08 RXNE xff09 和空闲中断的串口转发功能 0 实验背景 本实验的目的是实现串口的双向转发 xff0c 即向串口1写入数据后 xff0c 串口2及时输出串口1收到的数据 xff1b 向串口