【STM32HAL开发】学习笔记(3)——串口
1.串口的含义串口是一种设备通信的接口包含发送与接收功能。串口通信以数据帧的形式进行每一帧数据包含1位起始位、8/9位数据位以及0.5/1/1.5/2位停止位加粗是常用形式。串口处于空闲状态高电平起始位则是将串口拉低然后开始传输数据位传输完成后将输出拉高停止位处于高电平。有时候数据位的最后一位会被拿来作为校验位常见的校验有奇校验和偶校验。波特率是衡量通信速率的指标表述每秒传输的位数。常见波特率为9600115200。UARTUniversal Asynchronous Receiver / Transmitter通用异步收/发器只支持异步模式USARTUniversal Synchronous / Asynchronous Receiver / Transmitter通用同步/异步收/发器只支持同步和异步模式同步模式两个串口之间多了一个CLK时钟线。2.串口收发数据——无中断先在STM32CubeMX上进行配置串口在Connectiveity中找到USART1Mode选择Asynchronous波特率Baud Rate)设置为115200数据位长度Word Length设置为8校验位Parity设置为None即不使用校验位停止位Stop Bits设置为1Data Direction设置为Receive and Transmit收发双向。生成工程然后打开Keil串口收发代码如下uint8_t data; // 定义串口发送数组缓存区 uint8_t receive; // 定义串口接收区 //第一个参数为串口句柄由初始化配置生成第二个参数为发送数据的首地址 //第三个参数为一次发送数据的大小第四个为超时时间 HAL_UART_Transmit(huart1, (uint8_t *)data, sizeof(data), HAL_MAX_DELAY); //第一个参数为串口句柄由初始化配置生成第二个参数为发接收数据的首地址 //第三个参数为一次接收数据的大小第四个为超时时间 HAL_UART_Receive(huart1, receive, 1, HAL_MAX_DELAY);3.串口收发数据——有中断在STM32中串口中断收发是一种高效的通信方式能够在数据到达或发送完成时自动触发中断避免CPU轮询等待从而提升系统实时性与资源利用率。在Cube配置中使能NVIC。初始化代码HAL_UART_Receive_IT(huart1, rx_buf, 1); // 开启接收中断通过回调函数处理中断// 接收回调函数产生中断后自动调用 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart huart1) // 判断串口 { // 处理串口数据 // 重新使能接政 HAL_UART_Receive_IT(huart1, rx_buf, 5); } } // 发送回调函数 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { // 无需额外发送数据操作但可以通知主程序发送状态如设置标志位 }4.串口DMA收发数据在STM32中DMA可以用于减轻CPU的负担特别是在需要移动大量数据时。例如当需要将数据从一个外设传输到另一个外设或者从外设传输到内存时DMA可以直接建立数据通路而无需CPU介入。这样CPU就可以专注于其他更重要的任务如计算和控制。配置步骤使用DMA的前置配置与使用中断的一样然后再勾选上DMA点击Add--Select将TX和RX都选上其他的保持默认即可。在Keil中只需要将HAL_UART_Receive_IT()换成HAL_UART_Receive_DMA()将HAL_UART_Transmit_IT()换成HAL_UART_Transmit_DMA()即可实现与串口中断收发数据一样的效果。5.串口接收不定长数据对于STM32串口接收不定长数据常用的方法有两种(1)普通空闲中断每一个字节都进中断(2)空闲中断DMA。此外还有一种使用定时器超时判断的但是需要额外的定时器资源。(1)普通空闲中断原理每个接收到的字节都会触发接收中断RXNE在中断中手动存入缓冲区并计数。利用空闲中断判断帧结束。(2)空闲中断DMA开启串口的空闲中断IDLE当接收线上空闲超过一个字节时间时触发中断。使用DMA将接收到的数据自动搬运到缓冲区无需CPU干预每个字节。在空闲中断中通过DMA剩余计数器计算出本次接收的数据长度。在CubeMX中进行以下配置使能USART1的全局中断添加DMA通道方向为Peripheral to Memory模式Normal或Circular推荐Circular设置数据宽度为Byte使能DMA传输完成中断可选如果使用循环模式Circular则DMA会循环覆盖缓冲区适合连续接收如果使用正常模式Normal则每次接收完指定长度后停止需要重新启动。定义变量#define RX_BUF_SIZE 256 // 定义一个数组接收大小的宏数组大小不支持变量 uint8_t rx_dma_buf[RX_BUF_SIZE]; // DMA接收缓冲区 volatile uint16_t rx_len 0; // 本次接收的数据长度 volatile uint8_t rx_complete 0; // 接收完成标志初始化UART和DMA__HAL_UART_ENABLE_IT(huart1, UART_IT_IDLE); //使能串口空闲中断 HAL_UART_Receive_DMA(huart1, rx_dma_buf, RX_BUF_SIZE); //启用DMA接收数据循环模式空闲中断处理接收数据void USART1_IRQHandler(void)函数一般在stm32f1xx_it.c中这个是专门管理中断的。void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(huart1); /* USER CODE BEGIN USART1_IRQn 1 */ //处理空闲中断 if(__HAL_UART_GET_FLAG(huart1, UART_FLAG_IDLE) RESET) { //先关闭DMA防止这个时候收到数据影响当前数据的处理 HAL_UART_DMAStop(huart1); //接收数据到缓存区 rx_len RX_BUF_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx); //计算接收数据的长度 rx_comp_flag 1; //接收完成将标志设为1通知主循环 } //重新启用DMA接收数据 HAL_UART_Receive_DMA(huart1, rx_dma_buf, RX_BUF_SIZE); /* USER CODE END USART1_IRQn 1 */ }在主循环中对接收到的数据进行回发while (1) { if(rx_complete) { rx_complete 0; // 处理 rx_dma_buf 中的 rx_len 个字节 // 例如发送回去 HAL_UART_Transmit(huart1, rx_dma_buf, rx_len, 100); // 注意处理期间DMA可能正在接收新数据若需保护可使用双缓冲或临界区 } }归纳串口收发函数HAL_UART_Transmit(); //串口发送数据使用超时管理机制 HAL_UART_Receive(); //串口接收数据使用超时管理机制 HAL_UART_Transmit_IT(); //串口中断模式发送 HAL_UART_Receive_IT(); //串口中断模式接收 HAL_UART_Transmit_DMA(); //串口DMA模式发送 HAL_UART_Transmit_DMA(); //串口DMA模式接收 HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数 HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数 HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数用的较少 HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数 HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); //串口接收一半回调函数用的较少 HAL_UART_ErrorCallback(); //串口接收错误函数

相关新闻

【2013-12-17】设计模式学习笔记:组合模式

【2013-12-17】设计模式学习笔记:组合模式

[历史归档] 本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。 发布时间: 2013-12-17 | 标题:设计模式学习笔记:组合模式 | 分类: 编程 / 设计模式 / java &…

2026/7/14 6:29:30 阅读更多 →
C++ CAD数据交换:libdxfrw库读写DXF/DWG文件实战指南

C++ CAD数据交换:libdxfrw库读写DXF/DWG文件实战指南

1. 项目概述:为什么你需要关注 libdxfrw?如果你正在用 C 开发与 CAD 数据打交道的应用,无论是做机械设计软件、建筑信息模型(BIM)工具、数控(CNC)加工路径生成,还是游戏引擎的地图编…

2026/7/14 6:27:29 阅读更多 →
stable-diffusion.cpp:纯C/C++实现AI绘画推理,打造轻量高效的生成式AI运行时

stable-diffusion.cpp:纯C/C++实现AI绘画推理,打造轻量高效的生成式AI运行时

1. 项目概述:为什么我们需要一个纯C/C的Stable Diffusion推理库?如果你玩过AI绘画,大概率用过Stable Diffusion WebUI或者ComfyUI。它们功能强大,但背后依赖的是Python、PyTorch这一整套庞大的生态。启动慢、内存占用高、环境配置…

2026/7/14 6:25:29 阅读更多 →

最新新闻

终极指南:如何免费解锁Wand专业版并实现手机远程控制游戏修改

终极指南:如何免费解锁Wand专业版并实现手机远程控制游戏修改

终极指南:如何免费解锁Wand专业版并实现手机远程控制游戏修改 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 厌倦了Wand(原…

2026/7/14 7:57:55 阅读更多 →
单样本强化学习提升大语言模型数学推理能力

单样本强化学习提升大语言模型数学推理能力

1. 项目概述:单样本强化学习如何激发大语言模型的数学推理能力去年调试一个开源大模型时,我发现模型在数学应用题上的表现总是不稳定。正当我准备放弃时,偶然尝试用强化学习微调特定解题步骤,意外发现模型对同类问题的泛化能力显著…

2026/7/14 7:57:55 阅读更多 →
Wand-Enhancer:三步免费解锁WeMod Pro高级功能的终极方案

Wand-Enhancer:三步免费解锁WeMod Pro高级功能的终极方案

Wand-Enhancer:三步免费解锁WeMod Pro高级功能的终极方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 还在为每月支付WeMod Pro订阅…

2026/7/14 7:57:55 阅读更多 →
Ubuntu下qpOASES二次规划库安装与C++项目集成实战

Ubuntu下qpOASES二次规划库安装与C++项目集成实战

1. 项目概述:为什么我们需要 qpOASES?如果你在 Ubuntu 上搞机器人控制、轨迹优化、模型预测控制,或者任何需要在线求解带约束优化问题的 C 项目,那你大概率绕不开“二次规划”这个坎。简单说,二次规划就是在一堆线性等…

2026/7/14 7:55:55 阅读更多 →
MATLAB Robotics Toolbox:从建模到轨迹规划的六轴机械臂全流程实战

MATLAB Robotics Toolbox:从建模到轨迹规划的六轴机械臂全流程实战

1. 六轴机械臂与MATLAB Robotics Toolbox基础第一次接触工业机械臂时,我被它精准的运动轨迹所震撼。六轴机械臂作为工业自动化领域的"多面手",其每个关节的协同运动背后,是复杂的数学建模和算法支撑。而MATLAB Robotics Toolbox就像…

2026/7/14 7:55:54 阅读更多 →
JavaQuestPlayer:跨平台QSP游戏开发与运行的全面解决方案

JavaQuestPlayer:跨平台QSP游戏开发与运行的全面解决方案

JavaQuestPlayer:跨平台QSP游戏开发与运行的全面解决方案 【免费下载链接】JavaQuestPlayer 项目地址: https://gitcode.com/gh_mirrors/ja/JavaQuestPlayer JavaQuestPlayer是一款基于JavaSE的QSP游戏开发与运行平台,为游戏开发者和玩家提供了一…

2026/7/14 7:55:54 阅读更多 →

日新闻

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:01:13 阅读更多 →
Perplexity vs ChatGPT vs Claude:实测127组复杂查询任务,谁才是真正可靠的“事实型AI助手”?

Perplexity vs ChatGPT vs Claude:实测127组复杂查询任务,谁才是真正可靠的“事实型AI助手”?

更多请点击: https://codechina.net 第一章:Perplexity 怎么用 Perplexity 是衡量语言模型预测能力的核心指标,数值越低表示模型对文本序列的不确定性越小、预测越精准。它本质上是交叉熵损失的指数形式,计算公式为:…

2026/7/14 0:01:13 阅读更多 →
全球首发!五一视界定制物理AI卫星ECS-1剑指万亿赛道

全球首发!五一视界定制物理AI卫星ECS-1剑指万亿赛道

五一视界发布公告,近日,公司与环天智慧科技股份有限公司(“环天智慧”)正式达成空天领域战略合作。环天智慧是国内领先、聚焦天基对地观测遥感卫星总体研制与在轨运营的商业航天企业,同时也是西南地区规模最大、具备全自主可控遥感卫星星座建…

2026/7/14 0:03:13 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/13 4:38:36 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/13 4:38:38 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/14 7:15:24 阅读更多 →

月新闻