搜索
bottom↓
回复: 0
打印 上一主题 下一主题

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

[复制链接]

出0入234汤圆

跳转到指定楼层
1

1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729



第十一章 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的构造对象方法如下:
  1. class machine.UART(id,baudeate,bits,parity,rx,tx,stop,timeout)
  2. 使用实例: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个字节,否则就会读取尽可能多的数据。
       其方法原型如下:
  1. uart.read([nbytes])
复制代码
       该方法的参数描述,如下表所示。

表11.1.3 UART.read方法参数描述

       返回值:一个包含读入数据的字节对象。如果如果超时则返回None。

       ②:读取字符到buf中,如果指定读n个字节,那么最多读取n个字节,否则就读取尽可能多的数据。另外读取数据的长度不超过buf的长度。
       其方法原型如下:
  1. uart.readinto(buf[, nbytes])
复制代码
       该函数的参数描述,如下表所示。

表11.1.4 UART.readinto方法参数描述

       返回值:读取和存储到buf中的字节数。如果超时则返回None。

       ③:读一行数据,以换行符结尾。
       其方法原型如下:
  1. uart.readline()
复制代码
       返回值:读入的行数,如果超时则返回None。

       ④:将buf中的数据写入总线。
       其方法原型如下:
  1. uart.write(buf)
复制代码
       该方法的参数描述,如下表所示。

表11.1.5 UART. write方法参数描述

       返回值:写入的字节数,如果超时则返回None。

       ⑤:检查是否有可读的数据。
       其方法原型如下:
  1. 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源码如下:
  1. from machine import UART,Pin
  2. import time


  3. if __name__ == '__main__':
  4.    
  5.     times = 0
  6.     # 初始化LED并输出高电平
  7.     led = Pin(0,Pin.OUT,value = 1)
  8.     # 初始化串口2
  9.     uart = UART(2,115200,rx = 9,tx = 8,bits = 8, parity = None, stop = 1)

  10.     while True:

  11.         # 判断有无收到信息
  12.         if uart.any():
  13.             print('Received data:')
  14.             text = uart.read(128)                # 接收128个字符
  15.             print(text)                         # 通过REPL打印串口2接收的数据
  16.         else:
  17.             times+=1
  18.             if (times % 1000) == 0:
  19.                 uart.write('ESP32S3 Development Board Serial
  20. Port Experiment\r\n')  # 发送一条数据
  21.             elif (times % 200) == 0:
  22.                 uart.write('Please enter data\r\n')        # 发送一条数据
  23.             elif (times % 30) == 0:
  24.                 led_state = led.value()
  25.                 led.value(not led_state)

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 07:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表