查看: 12254|回复: 0

[教程] 用UART应用实例说明MicroPython-ESP32串口通信方式

[复制链接]
  • TA的每日心情
    无聊
    2019-1-9 09:43
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2019-2-14 15:06:18 | 显示全部楼层 |阅读模式
    分享到:
    概要
    在本节课程阿凯为大家讲解了串口通信的接线方式,ESP32中的串口UART资源与相关API, 并给出了一个UART的小应用实例。

    串口通信
    UART执行标准UART/USART双工串行通信协议,关于串口通信你需要的预备知识有码元, 波特率, 奇偶校验等概念。可以在B站上观看串口通信科普视频

    TODO 英文的, 1Z实验室后面有精力也会考虑做一些科普视频

    硬件接线
    这里介绍的串口通信的使用方式不局限于ESP32开发板。
    两个单片机设备进行串口通信,或者单片机通过USB转TTL模块与PC进行串口通信。
    如果你对USB转TTL模块比较陌生的话,请打开淘宝自行搜索 USB转TTL模块 。

    另外请留意USB转TTL的芯片型号,你可能需要安装其驱动。
    我手里的这个USB转TTL的型号是CH340G, Ubuntu自带其驱动。
    1.png

    设备与设备之间至少需要接三个线。如下图所示:
    2.png
    △串口连接图

    关于USB转TTL
    GND是地线,提供低电平的参考电压。 接下来就是RX 信息接收端, 还有TX 信息发送端。 单片机A的RX 接单片机B的TX,  单片机B的RX 接单片机A的TX。

    **至于VCC接口,可接可不接, 如果USB转TTL的正负极接反了容易导致电脑主板的烧毁。 **

    要注意他们两个单片机的工作电压是否匹配,例如ESP32的工作电压是3.3v那么另外一个VCC接口也只能接VCC。  有的USB转TTL模块有3.3v与5v两个接口, 可以将ESP32开发板的VCC与USB转TTL的3.3v接口相连接, 或者将ESP32的VIN接口与USB转TTL的5v接口相连接。

    UART构造器
    不同于其他MicroPython开发板,ESP32可以自定义管脚作为UART, 不过ESP32自身只有两个UART资源。

    导入UART 模块
    1. from machine import UART
    复制代码

    UART对象的构造器函数:
    1. UART(id, baudrate, bits, parity, rx, tx, stop, timeout)
    复制代码

    • id : 串口编号

    ESP32的UART资源只有两个, id有效取值范围为1,2

    • bandrate: 波特率(时钟频率)

    常用波特率为:
    ○ 9600 (默认)
    ○ 115200
    信息接受双方的波特率必须一致,否则会乱码。

    • bits:单个字节的位数(比特数)

    ○ 8 (默认)
    ○ 7
    ○ 9

    • parity: 校验方式

    ○ None 不进行校验(默认)
    ○ 0 偶校验
    ○ 1 奇校验

    • rx:接收口的GPIO编号

    在ESP32上面很多个管脚都可以自定义为UART管脚有效GPIO编号如下:
    0,2,4,5,9,10, 12-19, 21-23,25, 26, 34-36, 39

    • tx:发送口的GPIO编号

    有效GPIO管脚编号同rx

    • stop: 停止位个数

    ○ 1 (默认)
    ○ 2

    • timerout: 超时时间

    取值范围: 0 < timeout ≤ 2147483647

    演示实例
    1. from machine import UART
    2. uart = UART(2, baudrate=115200, rx=13,tx=12,timeout=10)
    复制代码

    UART的API讲解

    字符串读写
    1. uart.read(10)        # read 10 characters, returns a bytes object
    2.                     # 读入10个字符, 返回一个比特对象
    3. uart.read()            # read all available characters
    4.                     # 读取所有的有效字符
    5. uart.readline()        # read a line
    6.                     # 读入一行
    7. uart.readinto(buf)  # read and store into the given buffer
    8.                     # 读入并且保存在缓存中
    9. uart.write('abc')    # write the 3 characters
    10.                     # 向串口写入3个字符abc
    复制代码

    字符读写
    1. uart.readchar()     # read 1 character and returns it as an integer
    2.                     # 读入一个字符
    3. uart.writechar(42)  # write 1 character
    4.                     # 写入ASCALL码为42的字符
    5. uart.writechar(ord('*')) # 等同于uart.writechar(42)
    复制代码


    检测串口是否有数据
    1. uart.any()          # returns the number of characters waiting
    复制代码


    ESP32串口自发自收实验
    接线 将开发板的 13号引脚与12号引脚用杜邦线相连接
    1. '''
    2. ESP32串口通信-字符串数据自发实验

    3. 接线 将开发板的 13号引脚与12号引脚用杜邦线相连接。

    4. '''
    5. from machine import UART,Pin
    6. import utime

    7. # 初始化一个UART对象
    8. uart = UART(2, baudrate=115200, rx=13,tx=12,timeout=10)

    9. count = 1

    10. while True:
    11.     print('\n\n===============CNT {}==============='.format(count))

    12.     # 发送一条消息
    13.     print('Send: {}'.format('hello {}\n'.format(count)))
    14.     print('Send Byte :') # 发送字节数
    15.     uart.write('hello {}\n'.format(count))
    16.     # 等待1s钟
    17.     utime.sleep_ms(1000)

    18.     if uart.any():
    19.         # 如果有数据 读入一行数据返回数据为字节类型
    20.         # 例如  b'hello 1\n'
    21.         bin_data = uart.readline()
    22.         # 将手到的信息打印在终端
    23.         print('Echo Byte: {}'.format(bin_data))

    24.         # 将字节数据转换为字符串 字节默认为UTF-8编码
    25.         print('Echo String: {}'.format(bin_data.decode()))
    26.     # 计数器+1
    27.     count += 1
    28.     print('---------------------------------------')
    复制代码



    样例输出
    1. ===============CNT 1===============
    2. Send: hello 1

    3. Send Byte :
    4. 8
    5. Echo Byte: b'hello 1\n'
    6. Echo String: hello 1

    7. ---------------------------------------


    8. ===============CNT 2===============
    9. Send: hello 2

    10. Send Byte :
    11. 8
    12. Echo Byte: b'hello 2\n'
    13. Echo String: hello 2

    14. ---------------------------------------


    15. ===============CNT 3===============
    16. Send: hello 3

    17. Send Byte :
    18. 8
    19. Echo Byte: b'hello 3\n'
    20. Echo String: hello 3

    21. ---------------------------------------
    复制代码


    课程预告
    上文讲解了如何使用ESP32的UART资源,如何发送与接收字符串。 如果后续深入学习的话,可能还涉及到:

    • PC串口调试助手的使用。
    • 自定义二进制通信协议。二进制数据打包与解包,需要用到python的的struct模块。
    • 使用PySerial让PC与ESP32进行串口通信



    本文作者 1Z实验室阿凯
    来源 简书


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 21:41 , Processed in 0.127718 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.