当前位置: 首页 > news >正文

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架

1. 引言

本教程旨在帮助嵌入式开发小白从零开始,学习如何在STM32F407微控制器上实现一个基于串口的数据接收程序。该程序能够通过判断数据头来接收一串数据,并将其存储到缓冲区中以供后续处理。教程内容涵盖基础知识、配置步骤、HAL库函数详解,并提供配套例程和代码注释。

2. 硬件准备
  • STM32F407开发板
  • 串口调试工具(如串口助手)
3. 软件准备
  • Keil MDK-ARM开发环境
  • STM32F407标准库
4. 知识储备

在开始编程之前,需要了解以下基础知识:

  • STM32F407的串口(USART)外设
  • 基本的串口通信知识(波特率、数据位、停止位、校验位)
  • C语言编程基础
  • 中断服务函数的基本概念
5. 程序设计
5.1 程序功能概述

程序的主要功能包括:

  • 初始化STM32F407的串口外设
  • 通过中断方式接收串口数据
  • 检测数据头(特定字节序列)
  • 存储接收到的数据到缓冲区
  • 提供数据处理接口
5.2 程序模块划分

程序分为以下几个模块:

  • main.c:主程序文件,负责初始化和程序运行逻辑
  • usart.husart.c:串口驱动文件,负责串口的初始化和数据收发
  • data_receiver.hdata_receiver.c:数据接收模块,负责数据头检测和数据存储
5.3 程序流程图

.串口数据接收程序框架

流程图说明:
  1. 系统初始化:程序开始时进行系统初始化,包括时钟配置、GPIO配置等。
  2. 串口初始化:配置串口参数(如波特率、数据位、停止位等),使串口准备好接收数据。
  3. 等待中断触发:程序进入等待状态,等待串口接收到数据后触发中断。
  4. 接收数据:中断触发后,程序从串口接收数据。
  5. 检测数据头:检查接收到的数据是否包含有效的数据头,以确保数据的完整性。
  6. 存储数据:将接收到的有效数据存储到内存或外部存储器中。
  7. 数据处理:对存储的数据进行进一步的处理,如解析、计算等。

这个流程图清晰地展示了从系统初始化到数据处理的完整流程,帮助理解基于STM32F407的串口数据接收程序的工作原理。

6. 代码实现
6.1 串口初始化 (usart.c)
#include "usart.h"void USART_Init(uint32_t baudrate) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 使能GPIO和USART时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// 配置GPIO引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置USARTUSART_InitStructure.USART_BaudRate = baudrate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// 使能USARTUSART_Cmd(USART1, ENABLE);// 配置 NVIC 优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
6.2 数据接收模块 (data_receiver.c)
#include "data_receiver.h"#define DATA_BUFFER_SIZE 100
#define HEADER_SIZE 3
#define HEADER_1 0xEB
#define HEADER_2 0x00
#define HEADER_3 0x55static uint8_t data_buffer[DATA_BUFFER_SIZE];
static uint16_t buffer_index = 0;
static uint8_t header_received = 0;void DataReceiver_Init(void) {buffer_index = 0;header_received = 0;
}void USART1_IRQHandler(void) {if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {uint8_t received_data = USART_ReceiveData(USART1);if (header_received < HEADER_SIZE) {if (received_data == header[header_received]) {header_received++;if (header_received == HEADER_SIZE) {// 数据头检测完成,开始接收数据buffer_index = 0;}} else {header_received = 0;}} else {if (buffer_index < DATA_BUFFER_SIZE) {data_buffer[buffer_index++] = received_data;}}}
}uint8_t* GetDataBuffer(void) {return data_buffer;
}uint16_t GetBufferDataLength(void) {return buffer_index;
}
6.3 主程序 (main.c)
#include "usart.h"
#include "data_receiver.h"int main(void) {// 系统时钟配置SystemClock_Config();// 初始化串口USART_Init(9600);// 初始化数据接收模块DataReceiver_Init();while (1) {// 主循环可以添加其他任务}
}
7. 使用示例
7.1 初始化串口

main.c 中调用 USART_Init 函数,配置串口参数:

USART_Init(9600); // 配置波特率为9600
7.2 初始化数据接收模块

调用 DataReceiver_Init 函数,初始化数据接收模块:

DataReceiver_Init();
7.3 数据接收与处理

在中断服务函数 USART1_IRQHandler 中,接收到的数据会被存储到 data_buffer 中。主程序可以通过以下函数获取接收到的数据:

uint8_t* data = GetDataBuffer();
uint16_t data_length = GetBufferDataLength();
8. 串口收发状态图

以下是基于STM32F407的串口数据接收程序的状态图,展示了串口收发的状态转换过程:
在这里插入图片描述

串口数据接收程序的状态图

9. 总结

通过本教程,读者可以掌握如何在STM32F407上实现一个基于串口的数据接收程序。程序通过检测数据头来接收数据,并将其存储到缓冲区中以供后续处理。教程内容从零开始,详细讲解了串口配置、数据接收、中断处理等关键步骤,并提供了完整的代码示例和注释,帮助读者快速上手。

相关文章:

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架 1. 引言 本教程旨在帮助嵌入式开发小白从零开始&#xff0c;学习如何在STM32F407微控制器上实现一个基于串口的数据接收程序。该程序能够通过判断数据头来接收一串数据&#xff0c;并将其存储到缓冲区中…...

HSPF 水文模型建模方法与案例分析实践技术应用

在水文模拟领域&#xff0c;HSPF 模型&#xff08;Hydrological Simulation Program Fortran&#xff09;与 SWAT 模型一样&#xff0c;都是备受瞩目的水文模型软件。HSPF 模型因其强大的功能和简便的操作&#xff0c;在全球范围内得到了广泛应用。该模型不仅能够在缺乏测量数据…...

设置 CursorRules 规则

为什么要设置CursorRules&#xff1f; 设置 CursorRules 可以帮助优化代码生成和开发流程&#xff0c;提升工作效率。具体的好处包括&#xff1a; 1、自动化代码生成 &#xff1a;通过定义规则&#xff0c;Cursor 可以根据你的开发需求自动生成符合规定的代码模板&#xff0c…...

人工智能AI在汽车设计领域的应用探索

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…...

《当AI生成内容遭遇审核:需求与困境的深度剖析》:此文为AI自动生成

AI 内容审核&#xff1a;数字时代的守门人 在当今数字技术迅猛发展的浪潮中&#xff0c;AI 在内容生成领域取得了令人瞩目的成就&#xff0c;成为了推动创新与变革的核心力量。以 AI 绘画为例&#xff0c;从早期简单粗糙的图像生成&#xff0c;到如今能够创作出细节丰富、风格多…...

【无人机与无人车协同避障】

无人机与无人车协同避障的关键在于点云数据的采集、传输、解析及实时应用&#xff0c;以下是技术实现的分步解析&#xff1a; 1. 点云数据采集&#xff08;无人机端&#xff09; 传感器选择&#xff1a; LiDAR&#xff1a;通过激光雷达获取高精度3D点云&#xff08;精度达厘米…...

ComfyUI AnimeDiff动画参数总结

ComfyUI AnimeDiff动画参数总结 一、动画生成核心参数 参数名称建议值/范围作用说明备注步数&#xff08;Steps&#xff09;15-25控制AI计算迭代次数&#xff0c;越高细节越精细&#xff0c;但耗时更长推荐20步&#xff0c;显存不足可降至15步CFG值7.0-8.5提示词对画面的控制…...

No manual entry for printf in section 3

问题描述 在尝试查看 printf 的 C 函数手册页&#xff08;即 man 3 printf&#xff09;时遇到了 “No manual entry for printf in section 3” 的错误信息。 解决方案 出现这问题&#xff0c;是由于系统上没有安装对应的部分的手册页&#xff0c;因此安装对应的部分的手册…...

React 之 Redux 第二十八节 学习目标与规划大纲及概要讲述

接下来 开始Redux 全面详细的文档输出&#xff0c;主要基于一下几个方面&#xff0c;欢迎大家补充指正 一、Redux 基础概念 为什么需要 Redux&#xff1f; 前端状态管理的挑战&#xff08;组件间通信、状态共享&#xff09; Redux 解决的问题&#xff1a;集中式、可预测的状态…...

OSPF路由ISIS路由与路由学习对比(‌OSPF vs ISIS Routing Learning Comparison)

OSPF路由ISIS路由与路由学习对比 1.OSPF 路由学习规律 OSPF使用链路状态数据库&#xff08;Link State Database&#xff09;来存储网络拓扑信息。每个OSPF路由器通过交换链路状态更新&#xff08;Link State Updates&#xff09;来了解整个网络的拓扑&#xff0c;并根据收到…...

PMP项目管理—资源管理篇—1.规划资源管理

文章目录 基本信息4W1HITTO输入工具与技术输出 三种组织结构图和职位描述组织分解结构 OBS职责分派矩阵 RAMRACI矩阵说明 文本格式 资源管理计划团队章程 基本信息 4W1H what: 规划资源管理是定义如何估算、获取、管理和利用端对以及实物资源的过程。why: 资源规划用于确定和…...

Kafka 消息 0 丢失的最佳实践

文章目录 Kafka 消息 0 丢失的最佳实践生产者端的最佳实践使用带有回调的 producer.send(msg, callback) 方法设置 acks all设置 retries 为一个较大的值启用幂等性与事务&#xff08;Kafka 0.11&#xff09;正确关闭生产者与 flush() 方法 Broker 端的最佳实践设置 unclean.l…...

机器学习算法——回归任务

回归分析是估计因变量和自变量之间关系的过程。 目录 1、多元线性回归 2、岭回归 3、Lasso回归 4、弹性网络回归 5、多项式回归 6、指数回归 7、自然对数回归 8、广义线性模型 GLM 9、Cox比例风险模型 10、决策树回归 11、随机森林回归 12、梯度提升回归 13、XGBoost回归 14、…...

【数据库】数据库基础

第一章 数据库基础 一、数据库基础1.1 数据库系统的体系结构 &#xff08;三层模式两级映像&#xff09;1.1.1 逻辑模式1.1.2 外模式1.1.3 内模式1.1.4 外模式/模式映象1.1.5 逻辑模式/内模式映象1.1.6 逻辑独立性1.1.7 物理独立性 1.2 数据模型 一、数据库基础 1.1 数据库系统…...

端到端自动驾驶——cnn网络搭建

论文参考&#xff1a;https://arxiv.org/abs/1604.07316 demo 今天主要来看一个如何通过图像直接到控制的自动驾驶端到端的项目&#xff0c;首先需要配置好我的仿真环境&#xff0c;下载软件udacity&#xff1a; https://d17h27t6h515a5.cloudfront.net/topher/2016/November…...

深度学习R8周:RNN实现阿尔兹海默症(pytorch)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 数据集包含2149名患者的广泛健康信息&#xff0c;每名患者的ID范围从4751到6900不等。该数据集包括人口统计详细信息、生活方式因素、病史、临床测量、认知和功…...

vuex中的state是响应式的吗?

在 Vue.js 中&#xff0c;Vuex 的 state 是响应式的。这意味着当你更改 state 中的数据时&#xff0c;依赖于这些数据的 Vue 组件会自动更新。这是通过 Vue 的响应式系统实现的&#xff0c;该系统使用了 ES6 的 Proxy 对象来监听数据的变化。 当你在 Vuex 中定义了一个 state …...

JavaScript系列05-现代JavaScript新特性

JavaScript作为网络的核心语言之一&#xff0c;近年来发展迅速。从ES6(ECMAScript 2015)开始&#xff0c;JavaScript几乎每年都有新的语言特性加入&#xff0c;极大地改善了开发体验和代码质量。本文主要内容包括&#xff1a; ES6关键特性&#xff1a;解构赋值与扩展运算符&am…...

【量化金融自学笔记】--开篇.基本术语及学习路径建议

在当今这个信息爆炸的时代&#xff0c;金融领域正经历着一场前所未有的变革。传统的金融分析方法逐渐被更加科学、精准的量化技术所取代。量化金融&#xff0c;这个曾经高不可攀的领域&#xff0c;如今正逐渐走进大众的视野。它将数学、统计学、计算机科学与金融学深度融合&…...

3d投影到2d python opencv

目录 cv2.projectPoints 投影 矩阵计算投影 cv2.projectPoints 投影 cv2.projectPoints() 是 OpenCV 中的一个函数&#xff0c;用于将三维空间中的点&#xff08;3D points&#xff09;投影到二维图像平面上。这在计算机视觉中经常用于相机标定、物体姿态估计、3D物体与2D图…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...