1.UART的简介
STC8H有四个UART,UART意为通用串行通信接口,是一种全双工异步的通信方式,全双工代表数据能同时在两个方向上进行传输,异步代表没有公共的时钟线,UART有两根数据线(TXD和RXD),在连接方式上将互为主从的两个设备TXD和RXD交叉连接,两个设备应共地。
因为没有公共的时钟线,需要设置固定的波特率来约定数据传输的速率(即设备每隔多久才能读取一次数据线上的电平高低)。一般的串口数据帧为1位开始位+8位数据位+无校验位+1位停止位。用定时器来产生稳定的波特率,必须保证相互通讯的两个设备之间的波特率相同。
串口通信能在MCU和上位机之间通信,方便调试程序。多个MCU也可利用串口进行通信,如OpenMV和主控板之间。工业上用的RS232,RS485接口也用到了串口,还有蓝牙,WIFI模块等。
2.串口收发的方式
正确配置串口后,即可通过查询/中断的方式利用串口进行收发,向数据寄存器SxBUF(x = 2,3,4)写入字节,就将把数据发送出去,读取SxBUF寄存器中的字节就意味着把字节接收下来。发送和接收完成对应着两个中断请求标志位(TI和RI),必须软件清零。传统的8051单片机可以用位寻址的方式很容易找到对应寄存器中的这两位,而高级51单片机的多出的串口则要通过对寄存器的位操作来查询其他串口的这两个标志位。
等待串口发送完成 查询串口接收到数据
发送标志位和接收标志位并非一定作用于中断,也可以简单地认为是收发完成的信号,查询方式收发串口时也需要用到这两个标志位。况且要顺利地进入中断,还需要把各个进入中断的大门通通打开。
3.串口的初始化配置
要对串口寄存器和定时器寄存器进行设置
SCON:设置串口的工作模式,允许串口接收
AUXR:选择定时器作为波特率发生器,波特率6倍速
TH1、TL1:设置定时器的重装载值
TCON:打开定时器的运行控制位(TR1)
TMOD:设置定时器为16位自动重装载模式,设置定时器用作内部定时,设置定时器的gate
P_SW1/2:是否包含了对GPIO的初始化操作?
4.串口的流程
串口初始化 >> 打开串口中断 >> 使能总中断 >> 编写中断处理函数
5.注意事项
一定不能在中断和串口发送函数中同时清除发送标志位,中断回调执行会比函数执行更快一步,因此会因查询标志位失效而卡死