《ESP32-S3使用指南—MicroPython版 V1.0》第十一章 UART实验

第十一章 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”。接下来,可以根据提示通过串口调试助手发送一段任意的数据(以回车换行结束),随后立马就能看到串口调试助手上显示发送出去的数据,这就是本实验实现的数据回显。


请使用浏览器的分享功能分享到微信等