串口通信,是通用异步收发传输(Universal Asynchronous Receiver/Transmitter)的简称,有时我们也称为UART。
在单片机或嵌入式系统开发中,经常利用串口来辅助调试,打LOG。所以是一种非常基本但很重要的通信协议。
1 传输原理
将传输数据的每个字符以串行方式一位接一位传输。通常我们将一次传输称为一帧,那么这一帧中包括了起始位(1位,逻辑0)、数据位(5~8,可软件设置,一般使用8位)、校验位(奇、偶、无)、停止位(1位、1.5位、2位,通常用1位)
一般,单片机都支持8位的数据位和1位停止位。
以新唐003为例,串口有四种模式,其中模式1为异步全双工的工作方式,一帧包括10位数据(起始位,8位数据位和1位停止位),在传输时,8位数据位最低位先发送(LSB)。
2 波特率
异步串口通信有个重要的参数为波特率,传输的发送端有波特率,接收端也有波特率,有各自的时钟,这也就是异步的意思。如果两者的波特率有较大偏差,接收端将不能正确地识别数据(误码率高),很多低端单片机使用11.0592MHz的晶振,原因就在于该时钟产生的波特率非常准确。
那么我现在想要115200的波特率,该如何产生呢?像8051内核一般不会内置串口时钟模块,需要使用定时器来产生固定频率,新唐003可以选择定时器1或定时器3来产生串口波特率。在配置定时器时需要注意的是 让定时器工作在自动重装模式并且不要打开定时器中断,我们只需要定时器产生时钟就可以了。
3 数据的收发
了解基本原理后,接下来就到了数据收发阶段,其实很简单,在串口配置正确后,想要发送数据,就将数据写到SBUF寄存器。接收建议使用中断,当一帧数据接收完毕,接收标志RI将置1,如果使能接收中断,就会进入中断中,我们在串口中断中读SBUF寄存器就得到接收的数据。
4 高级功能 使用1个引脚实现半双工通信
新唐003串口引脚可由用户定义为发送或者接收,因此可以使用一个引脚实现半双工收发。这对于IO资源有限的单片机是很有用的。
如用P06实现收发,P06功能配置如下
当发送数据前,将P06功能设置为发送,发送完一字节数据后,将P06的功能切换接收模式并打开中断。
这个功能在通过UART升级固件时特别好用。
5 吐槽环节
系统时钟默认为16MHz,这个频率下出来的波特率误差都不小
虽然可以通过微调时钟到16.6MHz来解决,但这一大段代码加上去 还是不漂亮。