一、 定义
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信总线,仅用一根数据接收线和一根数据发送线就能实现全双工通信。典型的串口通信使用3根线完成,分别是发送线(TX)、接收线(RX)和地线(GND),通信时必须将双方的TX和RX交叉连接并且GND相连才可正常通信,连接方式如下图所示。
UART协议通常使用RS-232或RS-485等物理层协议来连接发送和接收设备。由于UART协议是一种简单、易于实现的协议,因此它在很多应用中得到广泛应用,例如串口通信、控制台、模块通信等。在工业、汽车、医疗和家庭等领域,UART协议都有着广泛的应用。
二、 特点
- 无主从之分,一个端口只能挂载一个设备
由于UART通信是点对点的通信方式,故通信双方不分主机和从机,且一个通信端口只能挂载一个设备,不能实现多机通信; - 两根通信线实现全双工通信
通信双方均包含两个通信引脚,Tx脚和Rx脚,且A端的Tx脚必须接B端的Rx脚,A端的Rx脚必须接B端的Tx脚,不能接反,否则无法通信,Tx是发送,Rx是接收,通信双方可以同时接收和发送,所以是全双工通信; - 异步方式
通信双方具有各自的时钟系统,且不一定同步,所以该通信方式为异步通信,这就造成会接收乱码的情况,所以会采用校验码对消息进行校验。
三、 协议构成
UART协议由空闲位、起始位、数据帧、校验位和停止位共同构成,如图为协议构成。
空闲位:高电平,表示目前处于空闲状态;
起始位:1bit,低电平,信号由高拉低表示通信开始;
数据帧:5~8bits,这几位是具体传输的消息,如果不使用校验位则最多可传输9bits,先发低位后发高位;
校验位:1bit,可有可无,可以配置成 1 位偶校验或 1 位奇校验或无校验位,作用是保证数据传输的准确性,否则容易乱码;
停止位:可以是0.5bit、1bit、1.5bits和2bits,高电平,表示消息传输结束,每传一个数据帧需要一个停止位,所以这种通信方式不支持连续发数据帧。
四、 结构说明
STM32F103C8T6单片机具有USART1、USART2和USART3三组串口,每一组串口外设的结构都如上图所示,其中PCLK1为USART2和USART3两组串口的时钟源,PCLK2为USART1的时钟源。
时钟源输入波特率发生器可以为发送控制器及接受控制器提供波特率信号,常用波特率有4种:9600bps、19200bps、38400bps和115200bps。
接收/发送控制器分别用来控制单片机逐位接收和发送消息。待发送数据将保存在发送数据寄存器(TDR)中,通过发送移位寄存器由低位至高位逐位发送出去;而接收的过程与之相反,外部数据经过接收移位寄存器逐位接收,之后保存至接收数据寄存器(RDR)。为避免数据的覆盖,可结合DMA功能使用。
另外,单片机也具有硬件流控制功能,给相应流控引脚信号会触发通信,即图中的开关控制。
五、 代码分析
#include "stm32f10x.h" // Device header
#include <stdio.h>
#include <stdarg.h>
uint8_t Serial_RxData; //定义串口接收的数据变量
uint8_t Serial_RxFlag; //定义串口接收的标志位变量
/**
* 函 数:串口初始化
* 参 数:无
* 返 回 值:无
*/
void Serial_Init(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启USART1的时钟
RCC_APB2PeriphClockCmd<