Universal Asynchronous Receiver Transmitter,即通用异步收发器,是一种通用的串行异步通信总线。该总线有两条数据线,可以实现全双工的发送和接收。在嵌入式系统中常用于主机于辅助设备之间的通信。如图所示:
ps:一般情况下,处理器中都会集成UART控制器(包括接收器、发送器),我们使用UART串口通信时,只需要对其内部的相关寄存器进行设置即可,具体配置见芯片手册。
UART帧格式:
串口通信发送0x55(即01010101):
过程:1.空闲时数据线为高电平;
2.先发送一个起始位(低电平0);
3.发送数据是先发低位,再发高位(即10101010)
4.再发校验位,串口用奇偶校验(偶数个1则该位为高电平);(可省略)
5.最后发停止位(高电平1),可以是1位、1.5位、2位。
Ps:不能发完一个字节,紧接着发下一字节,这种情况是不允许的,必须有空闲位间隔开。究其原因,UART串口通信是异步通信,通信双方没有共同的时钟基准(CKL线),存在时间误差,连续发送字节会造成累积误差,因此每次最多发送一个字节。
思考问题:串口通信如何连续收发多少个1或0呢?举例01的波形和0011的波形一样,先低后高。但是低电平持续过程表示几个0,高电平持续过程表示几个1,我们不得而知。
解决问题:比特率,用于描述UART串口通信时的通信速度,其单位为bps,即每秒钟传送的bit数量。比特率为1bps,即每秒发1b it,高低电平持续一秒表示完整的0或1。
对比:波特率,其单位为Baud,即每秒传送符号(码元、波形)的个数。符号是在固定时间段T(称符号长度或码元长度)内持续存在的波形或特征状态。
关系:比特率=比特数/传输时间(bit/s)
波特率=符号数/传输时间(Baud)
波特率与比特率的关系为:比特率=波特率 单个符号对应的信息量
例如,二电平信号在波特率为1波特时,比特率为1比特每秒;而16QAM信号一个符号为16种状态中的一种,则一个符号的信息量为log216= 4比特,即波特率为1Baud时,比特率为4比特每秒。
总结:串口寄存器编程所需设置内容
- 设置帧格式;
- 设置接收、发送数据模式(轮询、中断、DMA);
- 设置波特率;
- 将发送数据写入发送寄存器;
- 发送一个数据前,先用while语句去判断状态寄存器(只读不写);
- 接收一个数据前,先用if语句去判断状态寄存器;
- 用赋值语句读取接收寄存器的数据。
补充:CPU于外围硬件数据交互的模式有三种
- 轮询:首先CPU想用数据,串口控制器替它接收外部数据。但问题是CPU不知所用数据何时到达串口寄存器。此时,CPU不断去读串口控制器的接收寄存器。直到串口控制器的接收寄存器有数据,CPU将其读走。
- 中断:首先CPU想用数据,串口控制器替它接收外部数据。CPU不知何时数据能够达到串口控制器。此时CPU与串口控制器约定:若接收寄存器接收到数据,就给CPU发一个中断信号。
- DMA(直接存储器访问):首先CPU想用数据,串口控制器替它接收外部数据。CPU不知何时数据能够达到串口控制器。接收寄存器接收数据后,直接将数据发给CPU的特定寄存器。当CPU想用数据时直接读取CPU内特定寄存器即可。