UART通讯协议

  1. 1. 简介
  2. 2. 波特率
  3. 3. UART帧

简介

UART,即Universal Asynchronous Receiver Transmitter,是通用异步收发器,是一种通用的串行异步通信总线。该总线有两条数据线,可以实现全双工的发送和接收。在嵌入式系统中常用于主机和辅助设备之间的通信。

串行:一次传输一位二进制数据;

并行:一次传输多个二进制数据;

单工通信:数据的发送方和接收方是固定的,比如只能由A向B发送数据;

双工通信:

  • 半双工:数据的传输双方都可以发送或接收数据,但是在同一时刻,只能由一方发送和接收。比如此时,A向B发送数据,那么A不会接收数据,B也不会发送数据;

  • 全双工:与半双工的不同时,A在向B发送数据的同时,B也可以向A发送数据;

波特率

波特率用于描述UART通信时的通信速度,单位为bps,即每秒钟传送的bit的数量。

UART帧

UART协议规定,在没有数据传输的时候(空闲),总线处于高电平状态。所以,在发送1字节数据之前,需要先发送起始位(低电平),作为开始发送数据的信号。在发送数据的时候(可以一次发送5-8bit的数据),先发低位再发高位。比如0x55,转化成二进制数为01010101,那么应该先发1。在发送完数据之后,会发送1bit校验位(可有可无,一般才用奇偶校验方式)。最后则是停止位,作为单次数据发送完成的信号,会将电平置为高电平(1/1.5/2个bit)。

UART帧格式

  1. 这里可能会用疑问,如果发送0011的话,前后那么00或者11的电平表现都是一样的,怎么区分发了一个0还是两个0呢?

还记得前面说的波特率吗?用1/波特率可以得到一个数字,即周期T。在UART协议中,每过一个T周期都会采集一次总线上的电平状态。对于00来说,第一个T采集到低电平,第二个T还是采集到低电平,第三个T是高电平,第四个T还是高电平,这样可以清楚的知道采集到的数据就是0011了。

  1. 串口为什么数据位一次只能发送5-8个bit?

因为数据的发送方与接收方的时钟可能存在误差,发送方在A0时刻发送一位数据,并持续T,但接收方不可能在A0时刻开始采集数据,由此会产生误差。如果数据位很多,这个误差可能会越来越大,最终导致从某位数据开始全是错误的数据。所以规定一次发送少量数据以减少误差,在发送下一个字节数据的时候会重新对齐时钟。