之前一直使用UART作为单片机之间以及和计算机的简单通信,但一直没有研究过该协议的内部原理。今天刚买了一个逻辑分析仪,于是使用该分析仪对UART数据进行分析,以便更好的理解UART协议原理。
UART协议虽然速率较低,但协议简单,实现起来很便捷。
首先,需要了解UART协议的几个参数,解释如下:
波特率:即每秒可以传输的码元个数
起始位:先发出一个逻辑”0”的信号,表示传输数据的开始。
数据位:可以选择的值有5,6,7,8这四个值,可以传输这么多个值为0或者1的bit位。这个参数最好为8,因为如果此值为其他的值时当你传输的是ASCII值时一般解析肯定会出问题。理由很简单,一个ASCII字符值为8位,如果一帧的数据位为7,那么还有一位就是不确定的值,这样就会出错。
校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。就比如传输“A”(01000001)为例。
1、当为奇数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数(奇校验)。
2、当为偶数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数(偶校验)。
此位还可以去除,即不需要奇偶校验位。
停止位:它是一帧数据的结束标志。可以是1bit、1.5bit、2bit的空闲电平。
空闲位:没有数据传输时线路上的电平状态。为逻辑1。
传输方向:即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。
这里配置以下:波特率115200,数据位8位,停止位1,无校验位
因为波特率为115200,因此码元宽度为1s/115200=8.68us
使用逻辑分析仪测的波形图如下:
上图中每一个白点都代表数据的一位,每8个点构成一组数据。每组数据的前面都有一个低电平位表示起始,数据的末尾都有一个高电平代表数据的结束。采用16进制的显示,可以看出获取的数据分别为“0x30”,“0x65”,"0x6E","0x64","0x0D","0x0A"。将这些数据转换为ASCII字符为:"0","e","n","d","\r","\n"。