一、UART通信
UART是Universal Asynchronous Receiver / Transmitter的缩写,意即通用异步串行通信接口,是最常用的通信技术之一,广泛用于设备与电脑之间、设备与设备之间、设备内部芯片与芯片之间的通信。以两个5V单片机芯片之间的UART串口通信为例,如图1所示:
![](https://i-blog.csdnimg.cn/blog_migrate/144068381f9e03aa30943748e83ae9aa.jpeg)
图1 单片机之间UART通信示意图
图1就体现了两个单片机相互收发信息的结构,GND表示单片机系统电源参考地,即参考基准,通信双方需要基准一致。TXD为发送引脚,RXD为接收引脚。由于串口通信是全双工通信,所以通信线路针对某一片单片机来说,可以只有一条通信线路,只发送不接收,或者只接收不发送;也可以有两条,既发送又接收。
当单片机1想给单片机2发送数据时,比如发送一个0xE4这个数据,用二进制形式表示就是0b11100100,在UART通信过程中,是低位先发,高位后发的原则,那么就让TXD首先拉低电平,持续一段时间,发送一位0,然后继续拉低,再持续一段时间,又发送了一位0,然后拉高电平,持续一段时间,发了一位1……一直到把8位二进制数字0b11100100全部发送完毕。这里就涉及到了一个问题,就是持续的这“一段时间”到底是多久?由此便引入了串口通信中的一个重要概念——波特率,也叫做比特率。
波特率就是发送二进制数据位的速率,习惯上用baud表示,即发送一位二进制数据的持续时间=1/baud。在通信之前,单片机1和单片机2首先都要明确的约定好它们之间的通信波特率,必须保持一致,收发双方才能正常实现通信。
约定好速度后,还要考虑第二个问题,数据什么时候是起始,什么时候是结束呢?在UART通信的时候,一个字节是8位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位0表示起始位,然后发送8位数据位,数据位是先低后高的顺序,数据位发完后再发一位1表示停止位。这样本来要发送一个字节的8位数据,而实际上一共发送了10位,多出来的两位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到8位数据位后,检测到停止位,再准备下一个数据的接收,如图2所示。
![](https://i-blog.csdnimg.cn/blog_migrate/01b1467a0c1f43baa5359362897af525.png)
图2 串口数据发送示意图
图2串口数据发送示意图,实际上是一个时域示意图,就是信号随着时间变化的对应关系。比如在单片机的发送引脚上,左边的是先发生的,右边的是后发生的,数据位的切换时间就是波特率分之一秒。要观察到实际的串口通信,也可以用逻辑分析仪或者示波器等仪器测量单片机的串口通信,如图3是通过串口调试助手给单片机发送了一个0xE4数据,使用Kingst LA5016逻辑分析仪测量的一组波特率为9600的串口信号。从图3可以看出,左侧首先是一个起始位低电平(绿圆点标志),然后是8位数据(白圆点标志),低位在左边,高位在右边,最后一位停止位(红方点标志)。
![](https://i-blog.csdnimg.cn/blog_migrate/1809650bdc1ceba0f2167c032ffbd2b0.png)
图3 UART串口通信波形
二、RS232通信接口
在某些工业应用场景下,经常会遇到9针的串行接口,这个串行接口叫做RS232接口。先来认识一下这个标准串口,在物理结构上分为9针的和9孔的,习惯上我们也称之为公头和母头,如图4所示。
![](https://i-blog.csdnimg.cn/blog_migrate/6a6116a7349cd43f54a81c85fc2021f6.png)
图4 RS232通信接口
RS232接口一共有9个引脚,分别定义是:1、载波检测DCD;2、接收数据RXD;3、发送数据TXD;4、数据终端准备好DTR;5、信号地线SG;6、数据准备好DSR;7、请求发送RTS;8、清除发送CTS;9、振铃提示RI。
要让这个串口与单片机UART通信,只需要关心其中的2脚RXD、3脚TXD和5脚GND。虽然这三个引脚的名字与单片机上的串口名字一样,但是不能直接与单片机对连通信。对于RS232标准来说,它是个反逻辑,也叫做负逻辑。为何叫负逻辑?它的TXD和RXD的电压,-3V~-15V电压代表是1,+3~+15V电压代表是0。低电平代表的是1,而高电平代表的是0,所以称之为负逻辑。使用Kingst LA5016逻辑分析仪测量RS232波形如图5所示,在负逻辑的配置下,没有信号的时候为低电平,一位高位起始位(绿圆点标志),8位数据位(白圆点标志),1位停止位(红方点标志),高电平代表‘0’,低电平代表‘1’,解析的数据是0xE4。
![](https://i-blog.csdnimg.cn/blog_migrate/75bc70a1dc50537945cb8ea71266e6a2.png)
图5 RS232串口通信波形
因为RS232电平是负逻辑,且电平值可以高达十几V,而通常单片机引脚是兼容的TTL电平标准。那么RS232接口想要与单片机相连接,就需要用一个电平转换芯片(比如MAX232)来完成,如图6所示。
![](https://i-blog.csdnimg.cn/blog_migrate/01fb350960c9934ff7054c57a5ae47a8.png)
图6 典型的TTL到RS232电平转换电路
三、RS485通信接口
在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换。最初采用的方式是RS232接口,由于工业现场比较复杂,各种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。除此之外,RS232接口只能实现点对点通信,不具备联网功能,最大传输距离也只能达到十几米,不能满足远距离通信要求。而RS485则解决了这些问题,数据信号采用差分传输方式,可以有效的解决共模干扰问题,最大距离可达1200米,并且允许多个收发设备接到同一条总线上。
RS485采用差分信号进行通信,总线由2条线组成,分别命名为A和B,当A端电平大于B端电平时代表1,B端电平大于A端电平时代表0。所以RS485也不能直接与单片机引脚直接连接,而是需要专用的RS485转接芯片才可以与单片机UART接口连接,如图7所示。
![](https://i-blog.csdnimg.cn/blog_migrate/29d93b5e8a39a977608deb0c44ec3663.png)
图7 典型的TTL到RS485电平转换电路
MAX485芯片5脚和8脚是电源引脚;6脚和7脚就是RS485通信中的A和B两个引脚;1脚和4脚分别接到单片机的RXD和TXD引脚上,使用单片机UART进行数据接收和发送;2脚和3脚是方向引脚,其中2脚是低电平使能接收器,3脚是高电平使能输出驱动器,可以把这两个引脚连到一起,平时不发送数据的时候,保持这两个引脚是低电平,让MAX485处于接收状态,当需要发送数据的时候,把这个引脚拉高,发送数据,发送完毕后再拉低这个引脚就可以了。为了提高RS485的抗干扰能力,通常会在总线的两端,在A和B之间并接一个120Ω的电阻。
UART、RS232、RS485在通信的数据格式上是相同的,三者区别主要是逻辑电平的判定方式不同。RS232与RS485在经过专用的电平转换芯片转成TTL电平后就与标准的UART相同了,可以同样由单片机的UART外设来实现通信数据的收发。