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

STM32-- 串口发送数据

while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);??

答:

这行代码:

while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);

的作用是等待串口 USART2 的发送数据寄存器(TXE,Transmit Data Register Empty)变为空,确保可以向串口发送新的数据。


具体含义

  1. USART_GetFlagStatus()
    这是 STM32 标准外设库(SPL,Standard Peripheral Library)提供的函数,用于检查 USART 的标志位状态。

    • 第一个参数是串口实例(如 USART2)。
    • 第二个参数是标志位,这里是 USART_FLAG_TXE,表示发送数据寄存器是否为空。
  2. USART_FLAG_TXE

    • 当该标志位置位(值为 1)时,表示数据寄存器为空,当前可以写入新数据。
    • 当标志位被清除(值为 0)时,表示数据寄存器尚未准备好。
  3. while(... == RESET)

    • USART_FLAG_TXERESET 时,循环一直执行;只有标志位变为 SET 时,才能跳出循环。
    • 这是一个 阻塞式轮询,通常用于简单的发送数据逻辑。

典型用法

串口发送一个字节
void USART_SendChar(USART_TypeDef *USARTx, uint8_t c) {while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); // 等待 TXE 置位USART_SendData(USARTx, c);                                   // 写入数据寄存器
}
串口发送一个字符串
void USART_SendString(USART_TypeDef *USARTx, const char *str) {while (*str) {USART_SendChar(USARTx, *str++); // 逐字节发送}
}

注意事项

  1. 效率问题
    这种阻塞式轮询会占用 CPU,适合简单的、对实时性要求不高的任务。对于复杂的场景,推荐使用以下方式:

    • 中断方式:通过 USART 的中断功能检测 TXE 标志,进行非阻塞发送。
    • DMA:对于批量数据发送,DMA 是最优选择。
  2. 配置前置条件
    在使用 USART_GetFlagStatus() 之前,需要确保:

    • 串口已经正确初始化,包括波特率、模式等。
    • 启用了串口发送功能(USART_Cmd() 启用)。
  3. SPL 和 HAL

    • USART_GetFlagStatus() 是 SPL 的函数。如果你使用的是 HAL 库,对应的方式是:
      while (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE) == RESET);
      

改进方法

如果需要减少 CPU 的占用,可以考虑用中断替代轮询,示例如下:

发送完成中断
  1. 初始化串口发送中断:

    USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
    
  2. 在中断服务函数中发送数据:

    void USART2_IRQHandler(void) {if (USART_GetITStatus(USART2, USART_IT_TXE) != RESET) {USART_SendData(USART2, data_to_send); // 发送数据USART_ITConfig(USART2, USART_IT_TXE, DISABLE); // 关闭中断}
    }
    

通过中断的方式,可以显著提高 CPU 的利用率,尤其是需要频繁发送数据的场景。

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

相关文章:

  • 数据结构 (13)串的应用举例
  • qt-- - 版本和下载介绍
  • 解锁 Vue 项目中 TSX 配置与应用简单攻略
  • ShuffleNet:一种为移动设备设计的极致高效的卷积神经网络
  • yum源问题的解决方案
  • 在Linux中备份msyql数据库和表的详细操作
  • 实时数仓Kappa架构:从入门到实战
  • 【老白学 Java】Warship v2.0(四)
  • LLM之学习笔记(一)
  • C# 反射详解
  • pgadmin安装后运行不能启动界面的问题
  • 跳表(Skip List)
  • 前端实现把整个页面转成PDF保存到本地(DOM转PDF)
  • Vue 3 学习文档(一)
  • 【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配
  • 牛客周赛 Round 69(A~E)
  • Spring Boot 实战:分别基于 MyBatis 与 JdbcTemplate 的数据库操作方法实现与差异分析
  • 【jmeter】服务器使用jmeter压力测试(从安装到简单压测示例)
  • 使用Python实现自动化邮件通知:当长时程序运行结束时
  • 框架学习07 - SpringMVC 其他功能实现
  • NAT:连接私有与公共网络的关键技术(4/10)
  • RabbitMQ2:介绍、安装、快速入门、数据隔离
  • 衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录
  • 【Spring MVC】如何获取cookie/session以及响应@RestController的理解,Header的设置
  • C++设计模式行为模式———策略模式
  • Spring Cloud 中 bootstrap.yml 配置文件详解
  • Java项目实战II基于SpringBoot前后端分离的网吧管理系统(开发文档+数据库+源码)
  • ASP网络安全讲述
  • DFS 创建分级菜单
  • HDU Go Running(最小点覆盖 + 网络流优化)