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

stm32 HAL库下 阻塞 中断(it) DMA 三种模式下的串口通讯函数逻辑梳理(不一定正确)

本文根据课程和ai梳理的,不保证正确

总结:

函数 触发的回调函数 触发条件
HAL_UART_Receive_IT/DMA() HAL_UART_RxCpltCallback 缓冲区严格填满预设长度时触发(固定长度)。
HAL_UARTEx_ReceiveToIdle_DMA() 可能触发 RxEventCallbackRxCpltCallback - 空闲中断触发RxEventCallback(动态长度)
- 缓冲区满触发RxCpltCallback(固定长度)
  • 推荐使用ReceiveToIdle_(it/dma)来开启串口接收
  • RxEventCallback来进行后的处理
  • 顺带一提无论是用EventCallback还是CpltCallback,都要重新启用Receive或ReceiveToIdle,不然只会接收1次


  • 基础的发送接收

    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
    HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
    HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
    
    • 参数

      除了阻塞的串口 发送,读取 多一个超时uint32_t Timeout参数,剩下的参数都一样
      1. UART_HandleTypeDef *huart指定串口,例如&huart1
      2. uint8_t *pData指定缓冲区,通常是一个char数组,uart1_rx_buffer[128]这种,作为参数的时候填入指针也就是uart1_rx_buffer就行
      3. uint16_t Size指定读取的最大长度,别超过缓冲区就行
      • Transmit运行就会发送
        Receive仅仅是开启接受,什么时候接收完是另一回事
    • 接收回调函数

      基础的receive只有一种回调函数,HAL_UART_RxCpltCallback (以及报错HAL_UARTEx_RxEventCallback发生传输错误(如DMA溢出、噪声错误等)
      HAL_UART_RxCpltCallback触发的方式只有缓冲区满
      所以用这个的话我可能会把缓冲区大小设置为1,然后每次接收到扔另一个大的缓冲区里,用个定时器负责管理大缓冲区清除,一段时间没有收到信息就清除,然后你看你是每次收到1字节就处理一下还是定时器准备清除前处理一下大缓冲区数据,总的来说很麻烦,
  • 可检测空闲的接收

    HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen,uint32_t Timeout)//这个用不上HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
    
    • 参数

      • *huart 串口指针
      • *pData 缓冲区指针
      • Size 缓冲区大小
    • 回调函数

      • 缓冲区满了会触发HAL_UART_RxCpltCallback

      • 检测到空闲(有一帧没信息了)会触发HAL_UARTEx_RxEventCallback

      • 以及报错HAL_UARTEx_RxEventCallback发生传输错误(如DMA溢出、噪声错误等)

http://www.sczhlp.com/news/6918/

相关文章:

  • 使用DPO在SageMaker中定制Nova模型
  • 测试用例设计的7大核心方法:高效捕捉Bug的终极指南
  • 服务器网络慢到怀疑人生?Linux TCP/IP调优实战,性能提升200%+
  • 【IoTDB 线上小课 18】Apache 软件基金会是什么?开源世界的“超级孵化器”!
  • cellchat-气泡图美化
  • 贝塞尔曲线(Bzier curve)及应用
  • 思通数科AI视频卫士:用AI重塑无人机河道巡检新范式
  • heapdump深度利用之信息泄露篇
  • Transformer
  • python_Day05学习笔记
  • 第8章 指针(正在更新中......)
  • 区间 dp
  • 状压 dp
  • 使用 Docker 部署 Elasticsearch 集群
  • MBD笔记:PWM与DC-DC变换器的模型设计
  • ClickHouse 添加磁盘扩容存储
  • 作业感想
  • 软考系统分析师每日学习卡 | [日期:2025-08-06] | [今日主题:索引文件]
  • 我遇到的winapps问题解决方案
  • 完整教程:力扣面试150(45/150)
  • const char* 指针作为函数参数也能被修改?
  • C# 中 typeof 的正确打开方式:你真的了解它吗?
  • Docker部署Minio Java操作Minio - br
  • 模板
  • C++ 变量初始化方式总结 | 拷贝初始化 | 列表初始化 | 值初始化 - 详解
  • MySQL数据库二进制安装
  • 河南萌新联赛2025第(四)场:L(数论+素数筛)
  • 旋转锉的形状和用途
  • Golang笔记之Redis
  • 2025.8.06打卡