1. UART字符串发送的底层原理与工程实现
在嵌入式系统开发中,UART(通用异步收发传输器)是最基础、最广泛使用的通信外设。然而,初学者常将“发送字符串”简单理解为调用一个库函数即可完成,却忽略了其背后涉及的硬件状态机、时序控制与可靠性保障机制。本节以STM32F103系列MCU为例,深入剖析HAL_UART_Transmit()等高层API无法覆盖的关键细节——即如何在裸机或轻量级HAL封装下,安全、可靠地完成多字节字符串的逐字节发送,并从根本上规避数据丢失风险。
1.1 从单字节到字符串:UART发送缓冲区的状态演进
STM32F103的USART外设采用三级寄存器结构实现数据流控制:
- TDR(Transmit Data Register):CPU写入待发送字节的目标寄存器,宽度为8位;
- 移位寄存器(Shift Register):实际执行串行位移输出的硬件模块,宽度为8位;
- TXE(Transmit Data Register Empty)标志位:位于SR(Status Register)中,当TDR被硬件取走数据后自动置1,表示TDR已空,可写入下一字节。
关键点在于:TXE仅反映TDR是否为空,不反映移位寄存器是否已完成当前字节的串行发送。这是所有UART字符串发送可靠性问题的根源。
假设发送字符串"ABCD"(4字节): <