串口通信

罗大富 BigRich大约 5 分钟ESP32Python

单片机中最常用的通讯协议有 UART、I2C、SPI。我们已经学习了 I2C 和 SPI。这节课,我们来学习 UART,也就是串口通讯。

串口基本上是所有单片机中都具备的资源外设,使用它可实现程序下载,串口通信等。由于串口通信的简单方便,现如今越来越多的设备和模块支持串口通信功能,让开发工作变得越来越简单且高效。这节课我们来学习如何使用 MicroPython 控制 ESP32 的串口实现数据收发。

实验原理

要了解串口通信就要先了解串行通信并行通信

  1. 并行通信 就是说我们的数据字节用多条数据线同时开始发送,这种传输方式只适合短距离传输,这种传输方式使用较少,而且长距离传输成本高,所以只需要简单了解即可;
  2. 串行通信 是将数据字节一位一位的形式在一条传输线上逐个的传输,只需要一条数据线就可以了。发送时,要把并行数据变成串行数据发送到线路上,接收时,再把串行数据变为并行数据。

而关于串行数据传输也分为了两种方式,异步串行通信同步串行通信,一般同步串行方式使用较少,一般不会使用,不了解也没关系,而一定要了解的是异步串行通信方式。

异步通信 是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程,为使双方收发协调,要求发送和接收的设备的时钟尽可能一致。

异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,当每个字符的各位是以固定的时间传送的,即字符之间不一定有 位间隔 的整数倍关系,但同一字符内的各位之间的距离均为 位间隔 的整数倍。异步通信的一帧字符信息由 4 部分组成,如下图所示:

起始位,数据位,校验位还有就是停止位,由上图所示,一般我们也不需要使用校验位。但是串行通信偶尔也会使用校验位,校验位由名字就可以知道,就是说看你这帧数据有没有错误,在我们的串行通信中一般使用奇偶校验,数据位尾随的 1 位为奇偶校验位。奇校验时,数据中 1 的个数与校验位的和是奇数就为奇校验,反之就是偶校验,接收字符时,我们通过对 1 的个数的校验,若发现 1 的个数不一致,那么就说明数据传输过程中出现了错误。

UART 全称为通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),其工作原理是约定好通讯的波特率,然后将数据一位位地进行传输。

ESP32 有三个硬件 UART:UART0、UART1 和 UART2。它们每个都分配有默认的 GPIO,如下表:

UART0UART1UART2
TX11017
RX3916

UART0 用于下载和 REPL(交互式解释器) 调试,UART1 用于模块内部连接 FLASH,通常也不使用,因此可以使用 UART2 与外部串口设备进行通信。

硬件电路设计

物料清单(BOM 表):

材料名称数量
串口模块1
杜邦线(跳线)若干

ESP32 的 RX2 引脚连串口模块的 TX,TX2 连 RX,让 ESP32 和 串口模块都连接电脑。

将材料按照下图相连:

软件程序设计

UART 在 machine 的 UART 模块中,我们也是只需要了解其构造对象函数和使用方法即可。

构造函数 UART(id, baudrate, rx=None, tx=None, bits=8, parity=None, stop=1),作用是创建 UART 对象。

  • id:0、1、2;
  • baudrate:波特率,常用 115200、9600;关于波特率,单片机或计算机在串口通信时的速率用波特率表示,它定义为每秒传输二进制代码的个数,即 1 波特= 1 位/秒,单位是 bps。关于波特率的计算,在串行通信中,收发双方对发送或接收数据的速率要有约定。我们的电脑可以使用串口调试工具来设置我们电脑得参数,而我们的 ESP32 单片机就只能通过编程来设置了。
  • rx:数据接收引脚;
  • tx:数据发送引脚;
  • bits:数据位,默认为 8,在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为 8 位或 9 位长。
  • parity:数据校验位,默认为 None,在有效数据之后,有一个可选的数据校验位。
  • stop:默认为 1,停止位。

使用方法如下:

from machine import UART

# 创建 uart 对象
uart = UART(2, baudrate=9600)

# 写入 5 个 字节的内容
uart.write('hello')
# 读取到第 5 位的内容
uart.read(5)
# 判断串口是否输入数据
uart.any()

因此,我们可以这么写来实现与 PC 端串口助手进行数据收发:

from machine import UART


# 定义 UART 控制对象
uart = UART(2, 115200)

# 发送数据到串口工具中
uart.write('Hello')

while True:
    if uart.any():
        text = uart.read(20)
        print(text)
上次编辑于:
贡献者: Luo