UART:Universal Asynchronous Receiver / Transmitter,通用异步收发传输器,即我们通常说的串口。
串口是工程师最常用的一种串行外设,但在实际应用中还是会经常遇到各种问题。比如:丢失一字节数据。
今天我们就结合STM32来讲讲UART相关内容,以及容易丢失一字节数据的问题。
这几个标志位在编程中经常使用,数据丢失有可能就是对它们操作不当而导致出错。
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:检测到上溢错误
及时清除溢出错误标志
利用通信协议过滤因数据丢失导致的问题
中断函数里减少不必要的耗时
合理分配中断优先级
使能中断前清除标志位
使用更高精度晶振
降低通信波特率
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)
软件增加延时处理
使用通信协议增加应答机制