UART
是一种异步全双工串行通信
协议,由 Tx 和 Rx 两根数据线组成,因为没有参考时钟信号,所以通信的双方必须约定串口波特率
、数据位宽
、奇偶校验位
、停止位
等配置参数,从而按照相同的速率进行通信。
异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。当波特率为 9600bps 时,传输一个 bit 的时间间隔大约为 104.16us;波特率为 115200bps 时,传输一个bit的时间间隔大约为 8us。
数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。
数据通信时序图:
其中各位的意义如下:
起始位
:先发出一个逻辑”0”信号,表示传输字符的开始;
数据位
:可以是5~8位逻辑”0”或”1”;如ASCII码(7位),扩展BCD码(8位);小端传输,即LSB先发,MSB后发;
校验位
:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验);
停止位
:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平(用于双方同步,停止位时间间隔越长,容错能力越强);
空闲位
:处于逻辑“1”状态,表示当前线路上没有数据传送;
注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)。
↑图-1 起始位和停止位
↑图-2 数据位
↑传输“A”
上图是 uart 协议传输一个”A” 字符通过示波器的uart解码而得到的波形示意图。根据此图来介绍一下 uart 的一些基本参数。
波特率:
此参数容易和比特率混淆,其实他们是有区别的。但是我认为 uart 中的波特率就可以认为是比特率,即每秒传输的位数(bit)。一般选波特率都会有9600、19200、115200 等选项。其实意思就是每秒传输这么多个比特位数(bit)。
起始位:
先发出一个逻辑”0”的信号,表示传输数据的开始。
数据位:
可以选择的值有 5,6,7,8 这四个值,可以传输这么多个值为 0 或者 1 的bit位。这个参数最好为8,因为如果此值为其他的值时当你传输的是 ASCII 值时一般解析肯定会出问题。理由很简单,一个ASCII字符值为8位,如果一帧的数据位为7,那么还有一位就是不确定的值,这样就会出错。
校验位
:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。就比如传输 “A”(01000001) 为例。
1、当为奇数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数(奇校验)。图-1的波形就是这种情况。
2、当为偶数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数(偶校验)。
此位还可以去除,即不需要奇偶校验位。
停止位
:它是一帧数据的结束标志。可以是 1bit、1.5bit、2bit 的空闲电平。可能大家会觉得很奇怪,怎么会有1.5位~没错,确实有的。所以我在生成此 uart 信号时用两个波形点来表示一个bit。这个可以不必深究。。。
空闲位
:没有数据传输时线路上的电平状态。为逻辑 1。
传输方向
:即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。比如传输 “A” 如果是 MSB 那么就是 01000001(如图-2),如果是 LSB 那么就是10000010(如下图的图-4)
uart 传输数据的顺序就是:刚开始传输一个起始位,接着传输数据位,接着传输校验位(可不需要此位),最后传输停止位。这样一帧的数据就传输完了。接下来接着像这样一直传送。在这里还要说一个参数。
帧间隔
:即传送数据的帧与帧之间的间隔大小,可以以位为计量也可以用时间(知道波特率那么位数和时间可以换算)。比如传送”A”完后,这为一帧数据,再传”B”,那么A与B之间的间隔即为帧间隔。
↑图-3
↑图-4
上两图和下两图传送的数据和波特率都是一样的,但是有几个参数是故意设置反了从而形成对比。有助于更深入的理解UART。