页面加载中,请稍候
来源:电子工程世界发布时间:2023-02-221610浏览
询问 AI我们通常说的串口,一般指UART(Universal Asynchronous Receiver / Transmitter),通用异步收发传输器。
串口是工程师最常用的一种串行外设,但在实际应用中还是会经常遇到各种问题。比如:丢失一字节数据。
今天我们就结合STM32来讲讲UART相关内容,以及容易丢失一字节数据的问题。
UART几个标志位
这里重点说一下UART状态寄存器中的几个标志位:TXE、 TC、 RXNE、 ORE。

这几个标志位在编程中经常使用,数据丢失有可能就是对它们操作不当而导致出错。
TXE:发送数据寄存器为空 (Transmit data register empty)
0:数据未传输到移位寄存器
1:数据传输到移位寄存器
TC:发送完成 (Transmission complete)
0:传送未完成
1:传送已完成
RXNE:读取数据寄存器不为空 (Read data register not empty)
0:未接收到数据
1:已准备好读取接收到的数据
ORE:上溢错误 (Overrun error)
0:无上溢错误
1:检测到上溢错误
UART通信接口



UART接收丢失数据
UART接收丢失数据与软件和硬件都有可能有关系,下面说几个常见丢失数据的原因及解决办法。
及时清除溢出错误标志
利用通信协议过滤因数据丢失导致的问题
中断函数里减少不必要的耗时
合理分配中断优先级
使能中断前清除标志位
使用更高精度晶振
降低通信波特率
UART发送丢失数据
UART发送丢失数据很多工程师都遇到过,通常情况下是传输未完成的原因。
void UART_SendByte(uint8_t Data){while(RESET==USART_GetFlagStatus(USART1,USART_FLAG_TXE)); USART_SendData(USART1, Data);}
void UART_SendByte(uint8_t Data){while(RESET==USART_GetFlagStatus(USART1,USART_FLAG_TXE)); USART_SendData(USART1, Data);while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TC));}如果使用标准外设库,要根据实际情况封装函数,比如发送超时。
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)软件增加延时处理
使用通信协议增加应答机制
推荐阅读
干货|这几种常见的保护电路,你都了解吗?



新闻来源:电子工程世界,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
8 小时前
2026-06-11
2026-07-15