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标志确保发送完成后再进入低功耗模式
浙公网安备 33010602011771号