UART 通信原理
1. 数据包
在串口通信中,数据包的格式是起始位+数据帧(+校验位)+停止位组成的。
下面是串口通信数据包的示意图:
下面我们对这四个组成部分做一一解释。
1.1 起始位
在串口通信中,正常情况下,TX 和 RX 都是保持在高电平状态,如果需要发送数据,那么就把 TX 总线拉低,RX 发现 TX 被拉低之后就知道 TX 这边准备发送数据了,下面就是准备接收这个数据。
1.2 数据帧
数据帧就是需要发送的数据,一般情况下都是8 位,也就是一个字节,但是你也可以发送 5 位,6 位或者 7 位的数据,只要双方是相同的配置就可以。在没有校验位的情况下,也可以发送 9 位的数据。在数据发送过程中是 从低位(LSB)向高位(MSB) 进行发送。
1.3 校验位
校验位也称奇偶校验位,那是因为 UART 中,为了验证数据传输无误,通过计算‘1’的个数来校验数据,在使用偶校验
的情况下,如果这一数据帧中有偶数个‘1’,则这一位为 0,有奇数个‘1’,则这一位为 1;反之同理。所以称之为奇偶校验位。大多数情况下都不使用校验位。
1.4 停止位
当数据传输结束后,TX 总线会拉高 1-2 位的时间,正常情况都是1 位时间,停止位结束后才会进行下一轮的数据发送或者一直保持在高电平,结束通信。
2. 波特率
前面说到,UART 是异步通信,所谓异步,也就是说在 UART 中没有 Clock 线,不能在通信双方之间保持同步的数据收发,而是通过间隔一定时间对数据进行采样。这个一定的时间
也就是波特率,也称之为比特率,即发送一位所需要的时间。
常用的波特率有 300,600,1200,2400,4800,9600,14400,19200,28800,38400,57600,115200 等。在没有校验位,数据帧为 8 位,停止位为 1 位的情况下,我们发送一个数据包就是 10 位,如果使用的是 9600 波特率,所需要的时间就是\(\frac{1}{9600}*10\approx1.0416ms \)。
下面是串口通信的时域图:
由于是异步通信,数据采样就难免会有误差,为了减小这个误差,实际采样检测到开始位之后,等待半个位时间(0.5*1/Baudrate)后,以此为基准进行采样,这样可以保证采样点可以在每一位的中间。
波特率设置得越高,采样出错的可能性越大。
3. Arduino 的 Serial 库
再 Arduino 中,Serial.begin()
的第一个参数用来设置波特率,它还有第二个可选参数,可以用来设置发送的数据格式,可以选择几位数据帧,是否需要校验位(以及是奇数校验还是偶数校验),几位停止位等等。
有关 Arduino 的 Serial 库的更多详细内容,可以参考前面的章节(Arduino 基础/第八章——串口通信 UART)
4. 适用于那些设备
常见的使用串口通信的设备有以下几个:
HC-05 | ESP-01 | 电脑 |
---|---|---|
我们会在下面的章节详细介绍 HC-05 蓝牙模块的使用。