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

STM32实现串口接收不定长数据

原理

STM32实现串口接收不定长数据,主要靠的就是串口空闲(idle)中断,此中断的触发条件与接收的字节数无关,只有当Rx引脚无后续数据进入时(串口空闲时),认为这时候代表一个数据包接收完成了,在此时中断,对数据进行分析处理即可。

实现

具体实现方式就是使用HAL库的扩展函数(写在main函数里)

HAL_UARTEx_ReceiveToIdle_DMA(&huart2,DATE,50);

Ex 代表扩展,idle代表空闲中断,

参数:指针地址,变量,(一次性能接受的最大长度,一般是数组长度)


接下来重写回调函数

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

这个RXEvevtCallback与之前的RXCpltCallback,一个重要区别就是多了一个入参Size

因为之前都是已知数据长度,但RXEvevtCallback用于接收不定长数据,所以用Size来确认到底有几个数据,来发送 与接收数据相同的 字节数。

来看整体代码

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart == &huart2){HAL_UART_Transmit_DMA(&huart2,DATE,Size);HAL_UARTEx_ReceiveToIdle_DMA(&huart2,DATE,50);}
}

注意(1)

这里要养成好习惯:   确定 是通道二 之后再执行操作。

注意(2)

使用DMA时,会出现 “过半传输中断” 的情况,即数据传输一半便会 调用回调函数。

所以要 把他关闭。

用这段代码关闭。

__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);

参数:指针地址,要关闭的中断

所以刚才的代码应该是

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart == &huart2){HAL_UART_Transmit_DMA(&huart2,DATE,Size);HAL_UARTEx_ReceiveToIdle_DMA(&huart2,DATE,50);__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);}
}

别忘了程序开始时也要关闭噢。

 MX_GPIO_Init();MX_DMA_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */HAL_UARTEx_ReceiveToIdle_DMA(&huart2,DATE,50);__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);

http://www.lryc.cn/news/479778.html

相关文章:

  • AAA 数据库事务隔离级别及死锁
  • 外接数据库给streamlit等web APP带来的变化
  • Gitpod: 我们正在离开 Kubernetes
  • 1.每日SQL----2024/11/7
  • 普通一本大二学生,软件工程,想考研985,想知道哪个大学的软件工程好,又不至于完全考不起的?
  • 「QT」几何数据类 之 QMatrix4x4 4x4矩阵类
  • 让Apache正确处理不同编码的文件避免中文乱码
  • 人员密集场所遇到突发火灾事故该如何应对
  • 使用QtWebEngine的Mac应用如何发布App Store
  • 微机原理与接口技术——中断系统与可编中断控制芯片8259A
  • 【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
  • 面试题分享11月7日
  • 数据结构_哈夫曼树及其应用
  • 从0开始学习机器学习--Day19--学习曲线
  • 2.索引:深入解析 B+ 树:原理、MySQL 应用及与其他数据结构的对比
  • [全网最细数据结构完整版]第六篇:3分钟带你吃透栈并模拟实现
  • 如何在 Docker 容器中启动 X11 图形界面程序
  • pycharm保存是自动格式化
  • .netCore WebAPI中字符串加密与解密
  • Next.js + Move 石头剪刀布
  • [面试]关于Redis 的持久化你了解吗
  • Systemd:tmpfiles
  • 【Flutter 内嵌 android 原生 View以及相互跳转】
  • python externally-managed-environment 外部管理环境
  • 前端 | MYTED单篇TED词汇学习功能优化
  • 64 mysql 的 表锁
  • 【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】题库(1)
  • ajax关于axios库的运用小案例
  • 微搭低代码入门01变量
  • 盘点2024年10款视频剪辑,哪款值得pick!!