在嵌入式领域,UART(通用异步接收器 / 发送器)通信协议是一种被广泛应用的串行、异步、全双工通信协议。接下来,我们将详细介绍 UART 通信协议及其工作原理。
UART 通道由两条数据线构成,每个设备都配备一个 RX 引脚(用于接收)和一个 TX 引脚(用于发送)。连接时,一个设备的 RX 引脚需连接到另一个设备的 TX 引脚。值得注意的是,UART 没有共享时钟线,这正是其 “异步” 特性的体现。
UART 作为异步串行通信协议,其工作原理是逐位传输数据的每个二进制位。在 UART 通信中,信号线上高电平代表 “1”,低电平代表 “0”。例如,当传输一字节数据时,信号线上会呈现八种高低电平组合。
串行通信利用一根传输线逐位依次传输数据,也可用两根信号线实现全双工通信,如 rs232。其优点是通信线路简单,使用普通电缆即可,成本较低,适合远距离通信,但传输速度相对较慢。
异步通信以字符为传输单位,字符间时间间隔不固定,但同一字符内相邻位的时间间隔固定。通常,两个 UART 设备通信无需时钟线,不过需要指定相同的传输速率、空闲位、起始位、奇偶校验位和结束位,即遵循相同的协议。
数据传输速率用波特率表示,即每秒传输的位数。例如,若数据传输速率为 120 个字符 / 秒,每个字符包含 1 个起始位、7 个数据位、1 个校验位和 1 个停止位,共 10 位,则波特率为 10×120 = 1200 波特。
- 起始位:每次通信开始时,发送方发送一个逻辑 “0” 信号(VOL),以表明传输字符的开始。由于总线空闲时为高电平,所以起始信号与空闲状态差异明显。
- 数据位:起始位之后是要传输的数据,数据位可以是 5、6、7、8、9 位等组成一个字符,通常为 8 位,如 ASCII 码(7 位)、扩展 BCD 码(8 位)。数据传输时先发送位,发送位,低电平表示 “0”,高电平表示 “1”。
- 奇偶校验位:该位添加在数据位之后,用于验证数据传输的正确性。串口校验方式有多种:
- 无奇偶校验;
- 奇校验:若数据位中 “1” 的个数为偶数,奇偶校验位为 “1”;若为奇数,奇偶校验位为 “0”;
- 偶校验:若数据中 “1” 的个数为偶数,奇偶校验位为 “0”;若为奇数,奇偶校验位为 “1”;
- 标记奇偶校验:校验位始终为 1(不常用);
- 奇偶校验:奇偶校验位始终为 0(不常用)。
- 停止位:作为字符数据的结束标记,它可以是 1 位、1.5 位或 2 位 VOH。由于数据传输时各设备时钟可能存在小的不同步,停止位不仅表示传输结束,还为计算机提供了纠正时钟的机会。停止位越多,数据传输越稳定,但速度越慢。
在协议层,规定了数据包由起始位、主要数据、校验位和停止位组成。双方必须约定一致的数据包格式,才能正常收发数据。例如 mavlink 协议。
此外,异步通信没有时钟信号,两个通信设备需要就波特率达成一致,常见的波特率有 4800、9600、115200 等。串行通讯的数据包从起始信号开始,以停止信号结束,起始信号用逻辑 0 的数据位表示,停止信号可以用 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方协商一致即可。为解决数据通信受外界干扰导致传输错误的问题,有效数据后可添加可选的数据校验位,校验方式包括奇校验、偶校验、0 校验(空格)、1 校验(标记)、无奇偶校验。
- 帧错误:当接收器在预期位时间未看到停止位时,就会发生帧错误。若在预期停止位时数据线未处于预期的高状态(取决于 UART 的数据和奇偶校验位设置),UART 将发出帧错误信号。
- 奇偶校验错误:仅在 UART 处于奇偶校验模式时会引发。在该模式下,会发送一个额外位保存所有传输数据位的奇偶校验信息。若数据位出错,奇偶校验位也会错误,并抛出指定错误。
- 溢出错误:当接收器在下一个字符到达之前未处理(从输入缓冲区删除一个字符)时,会发生溢出错误。
- 中断条件:中断条件不一定是错误。当接收器输入处于逻辑低状态超过一定持续时间(通常超过一个字符时间)时会出现。对于接收者而言,这看起来像一个带有帧错误的全零字符,可用于软件复位电路。在 python 代码中,可通过发送 break 触发 reset,将数据线拉低足够长时间使 MCLR 拉低,实现电路板复位。
并不存在 “的” 通信外设,用户应根据项目需求选择合适的通信外设。例如,若追求快的通信速度,SPI 是理想选择;若想连接多个设备且不想过于复杂,I2C 则更为合适,因为它多可连接 127 个设备且易于管理。