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

HAL库的串口

普通串口:

直接打开一个串口的异步功能

发送函数:

 HAL_UART_Transmit(&huart5,buf,sizeof(buf),50);
//HAL_UART_Transmit(句柄,发送的内容,内容长度,允许的发送时间ms);

接收函数:(堵塞接收,在设定时间内都会访问串口数据)  

HAL_UART_Receive(&huart5,buf,sizeof(buf),HAL_MAX_DELAY);
//HAL_UART_Receive(句柄,接收数组,接受数据长度,允许等待的时间);
//HAL_MAX_DELAY  == 死等待发送

 

中断串口:

普通串口+打开全局中断

发送数据:

HAL_UART_Transmit_IT(&huart5,buf,sizeof(buf));
//HAL_UART_Transmit_IT(句柄,发送的数据,数据长度);
/*
用中断,所以较普通串口少了一个允许发送的时间
HAL_UART_Transmit(&huart5,buf,sizeof(buf),50);
*/

接收数据:(非堵塞接收,靠串口中断读取数据)  

HAL_UART_Receive_IT(&huart5,buf,sizeof(buf));
//HAL_UART_Receive_IT(句柄,数据缓存,数据长度);
/*
用中断,所以较普通串口少了一个允许等待的时间
HAL_UART_Receive(&huart5,buf,sizeof(buf),HAL_MAX_DELAY);
*/

较普通串口新增功能:串口中断

(但是这个中断汇总了很多中断类型:发送完成中断、接收完成中断;所以需要使用HAL_UART_IRQHandler其内部的函数,而非直接这个外框)

串口读取完成回调函数,当串口接收到目标数据长度后,会执行这个函数。

需要在自己需要的串口数据处理函数中,重新编写这个函数的功能,来实现接受数据后的数据处理。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit_IT(&huart5,buf,2);//返回接收的数据/*自己编写的串口数据处理代码如:if(buf[0] == 0xff)	//帧头{if(buf[5] == 0xfa)	//帧尾}*///重新打开串口接收HAL_UART_Receive_IT(&huart5,buf,2);}

使用举例:

但是这个中断需要接收到目标字符串长度才算完成一次接收,未达到则等待后续数据

DMA+串口空闲中断(ToIdle)发生时就是发送数据完成。

在中断的基础上添加TX和RX的DMA

使用的接收函数:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
/*
句柄、数据接收数组、单次最大数据长度*/

对应的回调函数:句柄、接收到的数据长度

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart == &MyHuart)//判断是哪个串口进入的回调函数{HAL_UART_Transmit_DMA(&huart5,buf,Size);//Sizes是收到的数据长度/*自己编写的串口数据处理代码如:if(buf[0] == 0xff)	//帧头{if(buf[5] == 0xfa)	//帧尾}*///重新打开串口接收HAL_UARTEx_ReceiveToIdle_DMA(&huart5,buf,sizeof(buf));}
}

中断串口和DMA串口的区别:

特性普通轮询(Polling)中断(IT)DMA
原理CPU 不断查询标志位数据到达后触发中断硬件自动搬运数据,不占用 CPU
CPU 占用高(阻塞式等待)中(中断响应时间)低(仅初始化时占用)
实时性差(阻塞其他任务)高(及时响应)高(后台自动传输)
适用场景简单调试、单任务环境中低速数据(如指令解析)高速数据(如摄像头、音频)
函数示例HAL_UART_TransmitHAL_UART_Transmit_ITHAL_UART_Transmit_DMA
接收函数示例HAL_UART_ReceiveHAL_UART_Receive_ITHAL_UART_Receive_DMA
是否需要回调函数是(如 HAL_UART_RxCpltCallback是(如 HAL_UART_RxCpltCallback
空闲中断支持不支持不支持支持(HAL_UARTEx_ReceiveToIdle_DMA
硬件依赖需启用 UART 中断需配置 DMA 通道

总结:

特性普通轮询(Polling)中断(IT)DMA
工作原理CPU 阻塞等待数据收发完成数据收发完成后触发中断回调硬件自动搬运数据,空闲中断触发回调
函数示例(发送)HAL_UART_Transmit(&huart, data, len, timeout)HAL_UART_Transmit_IT(&huart, data, len)HAL_UART_Transmit_DMA(&huart, data, len)
函数示例(接收)HAL_UART_Receive(&huart, data, len, timeout)HAL_UART_Receive_IT(&huart, data, len)HAL_UART_Receive_DMA(&huart, data, len) 或 HAL_UARTEx_ReceiveToIdle_DMA(推荐)
CPU 占用高(完全阻塞)中(中断响应时间)极低(仅初始化时占用)
实时性最高(后台自动传输)
重启接收不需要需要(在回调中手动调用 HAL_UART_Receive_IT需要(在回调中调用 HAL_UARTEx_ReceiveToIdle_DMA
中断配置需开启 UART 全局中断(NVIC)需开启 UART 空闲中断 + DMA 中断
关闭半传输中断需要(调用 __HAL_DMA_DISABLE_IT(&hdma, DMA_IT_HT)
适用场景单任务调试、简单指令中低速数据(如协议解析)高速数据(如传感器流、图像传输)



http://www.dtcms.com/a/285408.html

相关文章:

  • Vite/Vue 项目 | 开发环境指定Host(允许其它电脑访问)
  • uniapp+vue2——自定义底部导航tabbar
  • STC89C52系列单片机内部结构详解
  • 我用EV-21569-SOM评估来开发ADSP-21569(八)-UART串口例程
  • 基于单片机的点阵式汉字电子显示屏的设计
  • Vue3 业务落地全景:脚手架、权限、国际化、微前端、跨端与低代码 50 条实战心法
  • 基于单片机的便携太阳能光伏系统研究
  • 基于单片机金沙河粮仓环境监测系统设计与实现
  • stm32驱动双步进电机
  • 第三章第四节 按键控制光敏传感器控制蜂鸣器
  • LeetCode|Day18|20. 有效的括号|Python刷题笔记
  • 格式转换Total Excel Converter:20 种格式XLS XLSX 批量转 PDFWord
  • 饿了么app 抓包 hook
  • 【论文蒸馏】Recent Advances in Speech Language Models: A Survey
  • 怎么判断一个对象是不是vue的实例
  • 新手向:图片批量裁剪工具
  • 【IOS webview】IOS13不支持svelte 样式嵌套
  • 为什么IoTDB成为物联网场景的技术优选?
  • NAND闪存(NAND Flash)是什么?
  • rt_thread hc32f460引脚编号
  • 利用steps()分步实现奔跑的小熊案例
  • 『 C++ 入门到放弃 』- set 和 map 容器
  • 【机器学习深度学习】什么是 GGUF?
  • 【QT】调用外部dll
  • QT窗口(4)-浮动窗口
  • Qt窗口(2)-工具栏
  • 【嵌入式硬件实例】-555定时器实现LED追逐效果
  • Python的界面美化库 qt-material
  • 【机器学习】安装Jupyter及基本操作
  • Android如何使用Linux Quota管控app对userdata分区的磁盘空间使用