第十一章 UART实验
本章我们将学习ESP32-S3的串口,教大家如何使用ESP32-S3的串口来发送和接收数据。本章将实现如下功能:ESP32-S3通过串口和上位机的对话,ESP32-S3在收到上位机发过来的字符串后,原原本本的返回给上位机。
本章分为如下几个小节:
11.1 串口简介
11.2 machine.UART类
11.3 硬件设计
11.4 软件设计
11.5 下载验证
11.1 串口简介
串行接口(Serial Interface)简称串口,也称串行通信接口或串行通讯接口(通常指COM接口)。它采用串行通信方式,数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
11.1.1 数据通信的基本概念
这里将会简单讲解一下“串行/并行通信”、“单工/半双工/全双工通信”、“同步/异步通信”、“波特率”等知识。
1,串行/并行通信
平常经常会听到串行通信和并行通信,这两者其实很好去区分。而串口属于串行通信,特点就是数据是逐位按顺序依次传输,如下图所示。
图11.1.1.1 串行通信
并行通信,特点是数据各位通过多条线同时传输,如下图所示。
图11.1.1.2 并行通信
简单理解,这两者就是单车道和多车道的概念,同一个时刻,单车道只能通行一辆车,好比串行通信只能传递1位数据;多车道可以通行多辆车好比并行通信传递多位数据。
这两者的对比,我们这里也做了一点归纳,如下图所示。
表11.1.1.1 串行通信和并行通信的对比表
2,单工/半双工/全双工通信
按数据传输方向分类:单工通信、半双工通信和全双工通信,他们的通信图如下图所示。
图11.1.1.3 3种数据传输方向图
单工通信:数据只能沿一个方向传输
半双工通信:数据可以沿两个方向传输,但需要分时进行
全双工通信:数据可以同时进行双向传输
串行通信属于以上的全双工通信。
3,同步/异步通信
按数据同步方式分类:同步通信、异步通信,他们的区别如下图所示。
图11.1.1.4 同步和异步通信区别图
同步通信:共用同一时钟信号。
异步通信:没有时钟信号,通过在数据信号中加入起始位和停止位等一些同步信号。
串行通信属于以上的异步通信。
4,波特率
双方进行通信,假如不存在时钟信号去同步数据的传输的过程,就需要双方设置一样的数据传输速度,也就是波特率。
在二进制系统中,波特率的含义就是每秒传输多少位,当我们设置波特率为115200,这里的含义就是1秒钟传送9600位(bit)数据。串口通信默认的传输方式除了数据本身8位外,还需要加上起始位和停止位,所以传输1字节数据就需要10位。那1秒钟传输的数据量就是960字节,即一秒钟传输9600位 / 一字节需要传输10位 = 960字节。
11.1.2 UART四要素
①:通信双方是否能够正常使用串口进行通信主要有以下四个要素决定:
②:数据位的位数。数据位的位数由通信双方共同约定,一般可以是5~8位。
③:奇偶校验位。通信双方共同约定是否具备奇偶校验位。
④:停止位。停止时间长度。
⑤:波特率。波特率其实就是通信传输数据的速度,即每秒传输多少位。通信双方需在同一个波特率通信,否则会出现数据丢失、数据溢出和乱码等情况。
11.2 machine.UART类
machine.UART 类是 machine 模块中的一个重要硬件类别,它主要用于对 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)设备的配置和操作。UART 是一种常见的串行通信协议,它允许两个设备之间进行双向通信。在物理层面上,UART 由两根数据线组成:一根用于接收数据(RX),另一根用于发送数据(TX)。
通信的单元是一个字符,可以是 8 位或 9 位宽。这种设计使得 UART 适用于各种不同的应用场景,如数据采集、远程监控、设备间通信等。通过使用 machine.UART 类,我们可以轻松地配置 UART 设备、发送和接收数据,以及处理通信过程中的各种事件。
1,machine.UART类的构造对象
UART的构造对象方法如下:
class machine.UART(id,baudeate,bits,parity,rx,tx,stop,timeout) 使用实例:uart = UART(2,115200,rx = 9,tx = 8,bits = 8, parity = None, stop = 1)
该构造方法的参数描述,如下表所示。
表11.2.1 machine.UART构造方法参数描述
返回值: UART对象。
2,machine.UART类的方法
①:读取字符,如果指定读n个字节,那么最多读取n个字节,否则就会读取尽可能多的数据。
其方法原型如下:
uart.read([nbytes])
该方法的参数描述,如下表所示。
表11.1.3 UART.read方法参数描述
返回值:一个包含读入数据的字节对象。如果如果超时则返回None。
②:读取字符到buf中,如果指定读n个字节,那么最多读取n个字节,否则就读取尽可能多的数据。另外读取数据的长度不超过buf的长度。
其方法原型如下:
uart.readinto(buf[, nbytes])
该函数的参数描述,如下表所示。
表11.1.4 UART.readinto方法参数描述
返回值:读取和存储到buf中的字节数。如果超时则返回None。
③:读一行数据,以换行符结尾。
其方法原型如下:
uart.readline()
返回值:读入的行数,如果超时则返回None。
④:将buf中的数据写入总线。
其方法原型如下:
uart.write(buf)
该方法的参数描述,如下表所示。
表11.1.5 UART. write方法参数描述
返回值:写入的字节数,如果超时则返回None。
⑤:检查是否有可读的数据。
其方法原型如下:
uart.any()
返回值:可读数据长度。
11.3 硬件设计
1. 例程功能
本章实验功能简介:
1.回显串口接收到的数据
2.每间隔一定时间,串口发送一段提示信息
3.LED闪烁,提示程序正在运行
2. 硬件资源
1)LED灯
LED-IO1
2)独立按键
BOOT-IO0
3)USART2
IO9、IO8连接至正点原子Mini HSDAP模块的RX和TX引脚
3. 原理图
本章实验使用的USART2(IO9 和 IO8)通过杜邦线与正点原子Mini HSDAP模块的RX和TX相连。
11.4 软件设计
11.4.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
图11.4.1.1 程序流程图
11.4.2 程序解析
本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。UART实验main.py源码如下:
from machine import UART,Pin import time if __name__ == '__main__': times = 0 # 初始化LED并输出高电平 led = Pin(0,Pin.OUT,value = 1) # 初始化串口2 uart = UART(2,115200,rx = 9,tx = 8,bits = 8, parity = None, stop = 1) while True: # 判断有无收到信息 if uart.any(): print('Received data:') text = uart.read(128) # 接收128个字符 print(text) # 通过REPL打印串口2接收的数据 else: times+=1 if (times % 1000) == 0: uart.write('ESP32S3 Development Board Serial Port Experiment\r\n') # 发送一条数据 elif (times % 200) == 0: uart.write('Please enter data\r\n') # 发送一条数据 elif (times % 30) == 0: led_state = led.value() led.value(not led_state) time.sleep_ms(1)
这示例主要利用了UART2串口进行数据收发,并利用LED灯进行状态提示。具体来说,它首先初始化了LED设备并设置为高电平状态,然后初始化了UART2串口,设置了相应的参数。在主循环中,它不断地检查串口是否有数据接收,如果有则读取并打印出来,如果没有则根据不同的时间间隔发送不同的信息或切换LED状态。同时,为了避免过度操作,加入了延迟操作。
11.5 下载验证
板上的IO8和IO9通过杜邦线分别连接到Mini HSDAP模块的RX和TX引脚,并且使用USB线连接至PC端。然后,打开PC上的ATK-XCOM串口调试助手软件,选择正确的COM端口和相关的配置,例如波特率、数据位、停止位等。连接成功后,串口调试助手上会显示当前COM端口的状态信息,并且在每间隔一段时间就会打印一次“Please enter data”。接下来,可以根据提示通过串口调试助手发送一段任意的数据(以回车换行结束),随后立马就能看到串口调试助手上显示发送出去的数据,这就是本实验实现的数据回显。