【星云 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.h和usart.c:串口驱动文件,负责串口的初始化和数据收发data_receiver.h和data_receiver.c:数据接收模块,负责数据头检测和数据存储
5.3 程序流程图

流程图说明:
- 系统初始化:程序开始时进行系统初始化,包括时钟配置、GPIO配置等。
- 串口初始化:配置串口参数(如波特率、数据位、停止位等),使串口准备好接收数据。
- 等待中断触发:程序进入等待状态,等待串口接收到数据后触发中断。
- 接收数据:中断触发后,程序从串口接收数据。
- 检测数据头:检查接收到的数据是否包含有效的数据头,以确保数据的完整性。
- 存储数据:将接收到的有效数据存储到内存或外部存储器中。
- 数据处理:对存储的数据进行进一步的处理,如解析、计算等。
这个流程图清晰地展示了从系统初始化到数据处理的完整流程,帮助理解基于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. 引言 本教程旨在帮助嵌入式开发小白从零开始,学习如何在STM32F407微控制器上实现一个基于串口的数据接收程序。该程序能够通过判断数据头来接收一串数据,并将其存储到缓冲区中…...
文件上传复现
文件上传漏洞的概念 在现代互联网的web应用程序中,上传文件是一种常见的功能,因为它有助于提高业务效率,比如社交 网站中,允许用户上传图片、视频、头像和许多其他类型的文件。然而向用户提供的功能越多, web应 用受到…...
Redis——缓存穿透、击穿、雪崩
缓存穿透 什么是缓存穿透 缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库…...
HMC7043和HMC7044芯片配置使用
一,HMC7043芯片 MC7043独特的特性是对14个通道分别进行独立灵活的相位管理。所有14个通道均支持频率和相位调整。这些输出还可针对50 Ω或100 Ω内部和外部端接选项进行编程。HMC7043器件具有RF SYNC功能,支持确定性同步多个HMC7043器件,即确保所有时钟输出从同一时钟沿开始…...
STM32程序的加密与破解以及烧录方法
STM32程序的加密与破解,以及烧录方法。 盗取他人的PCB和烧录文件,可以节省大大开发成本,何乐而不为呢。因此,就滋生了一些协助他人盗版的公司。为了防止被盗版和复制,单片机工程师也是煞费苦心,对硬件和软…...
Redis和MySQL的实时数据同步方案
针对 Redis 和 MySQL 的实时数据同步,需根据业务场景选择不同的技术方案,核心目标是保障数据一致性、降低延迟、提升系统可靠性。以下是几种典型方案及其适用场景: 方案一:基于 MySQL Binlog 的异步同步 原理 监听 MySQL 的 Bin…...
VSCode知名主题带毒 安装量900万次
目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons,微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次,在微软实施删除后现在已安装这些扩展的开发者也会…...
JavaScript 进阶A(作用域、闭包、变量和函数提升、函数相关只是、数组解构、对象解构、构造函数
1.作用域 作用域主要分为:局部作用域和全局作用域。 局部作用域又分为:函数作用域和块作用域 函数作用域:在函数中定义的变量只能在函数内部使用,外部无法访问块作用域:被大括号{}包起来的代码块,在这个…...
mybatis映射文件相关的知识点总结
mybatis映射文件相关的知识点总结 mybatis官网地址 英文版:https://mybatis.org/mybatis-3/index.html 中文版:https://mybatis.p2hp.com/ 搭建环境 /* SQLyog Ultimate v10.00 Beta1 MySQL - 8.0.30 : Database - mybatis-label *****************…...
【UCB CS 61B SP24】Lecture 21: Data Structures 5: Priority Queues and Heaps 学习笔记
本文介绍了优先队列与堆,分析了最小堆的插入与删除过程,并用 Java 实现了一个通用类型的最小堆。 1. 优先队列 1.1 介绍 优先队列是一种抽象数据类型,其元素按照优先级顺序被处理。不同于普通队列的先进先出(FIFO)&…...
【JAVA】ThreadPoolTaskExecutor 线程池学习、后端异步、高并发处理
ThreadPoolTaskExecutor 是 Spring 框架提供的一个线程池实现类,基于 Java 原生的 ThreadPoolExecutor 进行了封装和扩展,支持更灵活的配置,并与 Spring 的依赖注入、生命周期管理等功能无缝集成。它常用于异步任务处理、定时任务调度和高并发…...
C#:LINQ学习笔记01:LINQ基础概念
一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型:对对象、XML、数据库等不同数据源使用一致的语法。强类型检查:编译时类型安全,减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...
爬虫系列之发送请求与响应《一》
一、请求组成 1.1 请求方式:GET和POST请求 GET:从服务器获取,请求参数直接附在URL之后,便于查看和分享,常用于获取数据和查询操作 POST:用于向服务器提交数据,其参数不会显示在URL中,而是包含在…...
【零基础到精通Java合集】第十集:List集合框架
课程标题:List集合框架(15分钟) 目标:掌握List接口核心实现类(ArrayList/LinkedList)的使用与场景选择,熟练操作有序集合 0-1分钟:List概念引入 以“购物清单”类比List特性:元素有序(添加顺序)、可重复、支持索引访问。说明List是Java集合框架中最常用的数据结构…...
小米手机如何录制屏幕?手机、电脑屏幕录制方法分享
大家最近有没有遇到想记录手机屏幕操作的情况? 比如精彩的游戏瞬间、有趣的视频教程,或者需要录制屏幕来制作演示材料。小米手机在这方面可是个好帮手,今天就来给你好好唠唠,小米手机如何录制屏幕,以及后续如何处理这…...
【RTC】 TM32 RTC(实时时钟)库函数 配置
1. 硬件配置 与HAL库相同,需确保以下硬件条件: 外部低速晶振(LSE,32.768kHz)连接至 OSC32_IN 和 OSC32_OUT 引脚。 备用电池(VBAT)已连接,确保断电时RTC持续运行。 2. 标准外设库(库函数)配置步骤 2.1 初始化RTC时钟源 #include "stm32f10x.h" #include…...
策略模式的C++实现示例
核心思想 策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在独立的类中,使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端,从而使得客户端可以根据需要动态切换算法,而不需要修改…...
deepseek、腾讯元宝deepseek R1、百度deepseekR1关系
分析与结论 区别与联系 技术基础与定制方向: DeepSeek官网R1版本:作为基础版本,通常保留通用性设计,适用于广泛的AI应用场景(如自然语言处理、数据分析等)。其优势在于技术原生性和官方直接支持。腾讯元宝…...
Leetcode 面试150题(三)
一、题目 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &am…...
3D Web轻量化引擎HOOPS Communicator的核心优势解析:高性能可视化与灵活部署!
在当今数字化时代,工业领域的工程应用不断向基于Web的方向发展,而HOOPS Web平台作为一款专为构建此类工程应用程序打造的软件开发套件集,正发挥着日益重要的作用,成为构建强大工程应用的基石。 一、HOOPS Web平台概述 HOOPS Web…...
python爬虫:python中使用多进程、多线程和协程对比和采集实践
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 多进程爬虫1.1 python多进程样例1.2 实现多进程爬虫2. 多线程爬虫2.1 python多线程样例2.2 实现多线程爬虫3. 协程爬虫3.1 python协程样例3.2 实现协程爬虫在网络爬虫中,为了提高抓取效率,常常需要使用多进程、多线…...
从 JVM 源码(HotSpot)看 synchronized 原理
大家好,我是此林。 不知道大家有没有这样一种感觉,网上对于一些 Java 框架和类的原理实现众说纷纭,看了总是不明白、不透彻。常常会想:真的是这样吗? 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…...
深入探索Python机器学习算法:模型调优
深入探索Python机器学习算法:模型调优 文章目录 深入探索Python机器学习算法:模型调优模型调优1. 超参数搜索方法1.1 网格搜索(Grid Search)1.2 随机搜索(Random Search)1.3 贝叶斯优化(Bayesia…...
windows 上删除 node_modules
在 Windows 11 上,你可以通过命令行来删除 node_modules 文件夹并清除 npm 缓存。以下是具体步骤: 删除 node_modules 打开命令提示符(Command Prompt)或终端(PowerShell)。 导航到项目目录。你可以使用 …...
postman请求后端接受List集合对象
后端集合 post请求,即前端请求方式...
Kimi“撞车”DeepSeek!新一代注意力机制的极限突破!
近期,各方大佬在注意力机制上又“打起来了”。首先登场的是顶流DeepSeek,新论文梁文锋署名,提出了一种新的注意力机制NSA。同天,Kimi杨植麟署名的新注意力架构MoBA开源。紧接着,华为诺亚提出高效选择注意力架构ESA。 …...
如何在Android中实现服务(Service)
在Android中,Service 是一种用于在后台执行长时间运行操作而不提供用户界面的组件。Service 可以执行各种后台任务,如下载文件、播放音乐、执行定时任务等。以下是如何在Android中实现Service的基本步骤: 1. 创建一个Service类 首先&#x…...
计算机网络---SYN Blood(洪泛攻击)
文章目录 三次握手过程SYN Flood攻击原理防御措施协议层优化网络层拦截系统配置调整 TCP协议是 TCP/IP 协议栈中一个重要的协议,平时我们使用的浏览器,APP等大多使用 TCP 协议通讯的,可见 TCP 协议在网络中扮演的角色是多么的重要。 TCP 协议…...
Ollama存在安全风险的情况通报及解决方案
据清华大学网络空间测绘联合研究中心分析,开源跨平台大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患。鉴于目前DeepSeek等大模型的研究部署和应用非常广泛,多数用户使用Ollama私有化部署且未修改默认配置,存在数据泄露、算力盗…...
视频流畅播放相关因素
视频播放的流畅度是一个综合性问题,涉及从视频文件本身到硬件性能、网络环境、软件优化等多个环节。以下是影响流畅度的关键因素及优化建议: 一、视频文件本身 1. 分辨率与帧率 1.问题:高分辨率(如4K)或高帧率&#…...
