• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wb-code

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

UART发送数据效率与可靠性问题

void ESP32_Writecommand(const char *command)
{
	while(*command)
	{
		while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
		USART_SendData(USART2,*command++);
	}
}
void ESP32_Writecommand(const char str[]) 
{
	int len=strlen(str);
	for(int i=0;i<len;i++)
	{
		while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
		USART_SendData(USART2,(uint16_t)str[i]);
		while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
		
	}	
}

这一段代码相比较上一段的区别主要是效率更高,只要发送缓冲区空闲立刻将数据填入,但是在数据传输的可靠性上没有下方的强。

建议:

  • 如果需要确保数据完全发送(如AT指令),使用第二段
    
  • 如果需要更高吞吐量,使用第一段
    
  • 可以在第一段最后添加一次USART_FLAG_TC检查,兼顾效率和可靠性
    

图片
结合实际场景:

// 发送一串数据,并在完成后执行操作
void SendMessage(uint8_t *data, uint16_t length) {
    for(int i = 0; i < length; i++) {
        // 等待可以写入新数据
        while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
        USART_SendData(USART1, data[i]);
    }
    
    // 等待所有数据完全发送
    while(!USART_GetFlagStatus(USART1, USART_FLAG_TC));
    
    // 现在可以安全执行后续操作
    OnTransmissionComplete();
}

简单原则:

  • 用TXE判断"是否可以发送下一个字节"
    
  • 用TC判断"是否所有数据都已物理发送完毕"
    

特殊情况:

  • DMA传输:通常使用TC标志来判断DMA传输完成
    
  • 中断模式:TXE中断用于及时补充数据,TC中断用于发送完成通知
    
  • 低功耗应用:使用TC标志确保发送完成后再进入低功耗模式
    

posted on 2025-12-30 16:49  心事不在脸上  阅读(0)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3