一、概述
只讨论嵌入式编程中较为常用的异步串行接口(Universal Asynchronous Receiver/Transmitter, UART),TTL电平。
串口的参数一般有:
1.波特率 ,数据传输速率,单位bps(bits per second),即每秒传输的位数,常见的波特率有9600bps、19200bps、115200bps等;如果波特率为115200bps,则传输一个bit的时间是1/115200s≈8.68us;
2.空闲位 ,当总线处于空闲状态时信号线的状态为'1'即高电平,表示当前线路上没有数据传输;
3.起始位 ,总线空闲时为高电平,所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平'0',来表示传输字符的开始;
4.数据位 ,起始位之后,跟着要传输的数据,数据可以是5、6、7、8、9等位,构成一个字符,一般是8位;一般先发送最低位,最后发送最高位(LSB),使用低电平表示'0'高电平表示'1'完成数据位的传输;
5.校验位 ,校验数据传送的正确性,分为以下几种方式:
①无校验(no parity),即不使用校验位;
②奇校验(odd parity),如果数据位中"1"的数目是偶数,则校验位为"1",如果"1"的数目是奇数,校验位为"0";
③偶校验(even parity),如果数据为中"1"的数目是偶数,则校验位为"0",如果为奇数,校验位为"1";
④ Mark校验,校验位始终为1;
⑤Space校验,校验位始终为0;
6.停止位 ,表示数据传输结束,高电平,可为1、1.5或2位,
7.传输方向 ,即数据是从高位(MSB)开始传输,还是从低位(LSB)开始传输;
下面通过逻辑分析仪抓取的串口通信的数据波形,直观地感受、理解各个参数的含义。
二、Uart通信数据波形
1.串口配置:9600bps,8数据位,无校验,1个停止位,从低位开始传输(LSB),数据为0xAA:
从上图可看出,BEGIN为起始位,低电平,然后是8位数据位,从低到高位依次是0、1、0、1、0、1、0、1,即二进制10101010,十六进制为0xAA,没有校验位,紧跟着一个END,为停止位,高电平,之后保持高电平(空闲);起始位、数据位、停止位共10位,时间间隔约为1.042ms,经测量,传输每一位的时间是一致、平均的,则传输每1位的时间为0.1042ms,波特率为9596.9bps≈9600bps,误差较小。
2.串口配置:19200bps,8数据位,奇校验,1个停止位,从低位开始传输(LSB),数据为0xAA、0xBA:
从上图可看出,加上校验位后,11位传输用时572us,则平均每位用时52us,即19230.8bps≈19200bps;数据0xAA中,共有4个"1",是偶数,所以校验位为1,而0xBA中共有5个"1",奇数,所以校验为是0,图中的"Right"表示校验正确。
将配置改为偶校验,其他不变,校验位如下图,对照偶校验的定义,可知校验正确:
将配置分别改为Mark校验、Space校验,其他不变,校验位分别如下面两图,可知校验正确:
Mark校验,校验位是1:
Space校验,校验位是0:
3.串口配置:19200bps,8数据位,无校验,2个停止位,从低位开始传输(LSB),数据为0xAA:
由前文可知,19200bps时每位的时间约52us,而上图中停止位END所占时间为M1与M2之间的间隔,104us,因此停止位为2位。
4.串口配置:19200bps,8数据位,无校验,1个停止位,从高位开始传输,即MSB方式(瑞萨的RL78系列MCU可以设置LSB或者MSB模式),数据为0xAA:
上图与前面几张图对比,LSB模式下,数据0xAA在BEGIN起始位之后,是按照从低到高位即0、1、0、1、0、1、0、1的顺序传输的,而上图是按照1、0、1、0、1、0、1、0的顺序传输的,逻辑分析仪也设置为按照MSB的模式接收,即可正确识别出数据0xAA。
5.串口配置:19200bps,7数据位,无校验,1个停止位,从低位开始传输(LSB),数据为0xAA:
上图中,传输的数据是0xAA,正常情况下,BEGIN起始信号后面应该是0、1、0、1、0、1、0、1,然后是停止位END,但实际上缺失了最后的1,即0xAA的最高位1,只有7位,数据变成了0x2A;
再试着发送数据0xFF,其他配置不变:
数据变为0x7F,仍然是最高位的1缺失;
接下来,发送数据0x7E:
虽然数据只有7位,但是正确的,因此在数据只有7位的情况下,传输小于0x7F的数据,即最高位本来就是0的情况,数据是可以正确传输的,例如传输ASCII码。
51单片机支持9位数据模式,可通过SCON寄存器的SM0、SM1、TB8、RB8位设置:
我们以51单片机STC8G1K08为例来观察9位数据的的波形;将串口配置数据为改为9位,其他不变,单片机串口1模式3,TB8位置0(即第9位数据为0),SBUF中的数据为0xAA:
从上图可看出,正确发出了9位数据;
下面将TB8位置1(即第9位数据为1),其他不变,数据波形第9位是1: