UART:Universal Asynchronous Receiver / Transmitter,通用异步收发传输器,即我们通常说的串口。
串口是工程师最常用的串行外设之一,但在实际应用中还是会经常遇到各种问题。比如:丢失一字节数据。
今天我们就结合STM32来讲讲UART相关内容,以及容易丢失一字节数据的问题。
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:检测到上溢错误
UART通信硬件接口
1.TTL
TTL比较简单,就是直接连接UART的Tx和Rx引脚,不需要外部转换。如图:
注意:Tx和Rx引脚需要交叉连接。
2.RS232
RS-232标准接口是常用的串行通信接口标准之一,规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V。
选用该电气标准的目的在于提高抗干扰能力,增大通信距离。
3.RS485
RS485一般采用两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上可以挂接多个节点。
在低速、短距离、无干扰的场合可以采用普通的双绞线;反之,在高速、长线传输时,则必须采用阻抗匹配(一般为120Ω)的RS485专用电缆;而在干扰恶劣的环境下还应采用铠装型双绞屏蔽电缆。
UART接收丢失数据
UART接收丢失数据与软件和硬件都有可能有关系,下面说几个常见丢失数据的原因及解决办法。
1.接收溢出丢失数据
指未及时取走数据导致溢出错误而丢失数据,通常是发生在大量数据、以查询方式接收数据的情况下。在MCU启动过程中、接收数据过多处理不及时、复杂系统响应不及时等情况都会出现数据丢失的情况。
解决办法:
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)
软件增加延时处理
使用通信协议增加应答机制
推荐阅读
添加微信回复“进群”
拉你进技术交流群!
国产芯|汽车电子|物联网|新能源|电源|工业|嵌入式…..
在公众号内回复您想搜索的任意内容,如问题关键字、技术名词、bug代码等,就能轻松获得与之相关的专业技术内容反馈。快去试试吧!
如果您想经常看到我们的文章,可以进入我们的主页,点击屏幕右上角「三个小点」,点击「设为星标」。
欢迎扫码关注