串口通信
串口通信是一种串行异步通信,通信双方以字符帧作为数据传输单位,字符帧按位依次传输,每个位占固定的时间长度。两个字符帧之间的传输时间间隔可以是任意的,即传输完一个字符帧之后,可以间隔任意时间再传输下一个字符帧。
1. 字符帧
字符帧由四个部分构成,分别是起始位、数据位、校验位以及停止位。起始位占1位,为逻辑0。数据位占5 ~ 8位,可配置。校验位占1位,可配置为奇校验、偶校验、无校验;配置为无校验时字符帧不包含校验位;配置为奇校验时,数据位中逻辑1的个数为奇数时,校验位的值为逻辑0,否则为逻辑1;配置为偶校验时,数据位中逻辑1的个数为偶数时,校验位的值为逻辑0,否则为逻辑1。停止位占1/1.5/2位,可配置,停止位的值为逻辑1。常用的字符帧格式如下图1.1所示,1位起始位、8位数据位、1位校验位、1位停止位。
图1.1 字符帧格式
2. 波特率
字符帧是按位依次传输,波特率即传输字符帧时的位速率,单位为bit/s。通信双方要使用相同的波特率,常用的波特率如9600、115200。
3. UART
UART是通用异步收发器(Universal Asynchronous Receiver/Transmitter)的简称,它是设备实现串口通信的核心部件。如图1.3所示,UART由发送器、接收器、波特率发生器组成,发送器由发送保持寄存器、发送移位寄存器、控制逻辑构成,接收器由接收保持寄存器、接收移位寄存器、控制逻辑构成。发送数据时,应用程序将字节数据写入发送保持寄存器,发送移位寄存器每次向右移动一位,将数据一位一位发送出去。接收数据时,每接收一位数据后,接收移位寄存器向左移动一位,直到接收一个字节数据为止,应用程序通过读取接收保持寄存器来获取接收的字节数据。波特率发生器用于产生接收和发送数据时所使用的波特率。
8051、STM32等MCU芯片的内部都集成了UART,两个MCU进行串口通信时,可将一个MCU的TX、RX引脚分别与另一个MCU的RX、TX引脚相连,如图3.2所示。
图 3.2 两个MCU进行串口通信时的硬件连接
UART进行串口通信使用TTL电平。5V工作电压的MCU,使用0 ~ 0.5V表示逻辑0,2.5V ~ 5V表示逻辑1;3.3V工作电压的MCU,使用0 ~ 0.5V表示逻辑0,2.5V ~ 3.3V表示逻辑1。5V的MUC不能与3.3V的MCU直接连接。
4. RS232标准
RS232标准使用+5 V ~ +15 V表示逻辑0,-5V ~ -15 V表示逻辑1。相比TTL电平,RS232电平提高了串口通信的抗干扰能力,增大了串口通信的距离。台式PC一般都带有RS232标准接口,MCU按RS232标准进行串口通信时,需加max232电平转换芯片,如图4.1所示。
图4.1 MCU与PC进行串口通信时的硬件连接
5. RS485标准
RS485标准使用差分电平表示逻辑0或1,当A与B的电压差为+2v ~ +6v 时表示逻辑1,当A与B的电压差为-2v ~ -6v时表示逻辑0。RS485为半双工通信,即通信节点不能同时进行数据的接收和发送。相比RS232电平,RS485电平使串口通信的抗干扰能力更强,通信距离更远。MCU按RS485标准进行串口通信时,需加max485电平转换芯片,如图5.1所示。
图5.1 两个MCU按485标准进行串口通信时的硬件连接
RS232只能进行点对点通信,RS485总线可以挂接多个通信节点实现联网功能,总线结构如图5.2所示。RS485总线通常采用主从通信方式,总线上只有一台主机,一台或多台从机,通信总是由主机发起,从机没有收到来自主机的请求时不会发送数据,从机之间不能相互通信。可以自定义主从通信协议或使用现有的协议,如Modbus。
图5.2 RS485总线结构