MicroPython+ESP8266:UART串口通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MicroPython+ESP8266:UART串口通信相关的知识,希望对你有一定的参考价值。

参考技术A 软件准备:

NodeMCU v2提供三个UART。您可以在TXD0,RXD0,TXD1,TXD2,RXD2上看到它们:

我们可以使用UART库访问UART串口。
在本章中,我使用Arduino板作为UART源。我们从UART读取传入的消息。开始吧!

在串口通信的教程中,我使用Arduino Uno连接到NodeMCU板。我们在连接到Arduino板的NodeMCU上使用UART0。我们应该将RX引脚连接到TX引脚,将TX引脚连接到RX引脚。

以下是我们的连线方式:

我的接线实现如下图所示:

首先,我们使用Arduino IDE为Arduino UNO编写程序。我们使用SoftwareSerial模拟软串口10和11.该程序将等待输入的UART数据,然后在0和1引脚上发送到Arduino UART。接下来开始写这个程序:

Arduino程序:

保存这个程序。然后,将其上传到Arduino板。在上传之前,请确保Arduino UART(数字0,1,10和11引脚)不能连接到任何电路或传感器。下一步是为NodeMCU板编写程序。创建一个名为uartdemo.py的文件。开始编写程序:

Nodemcu程序:

现在您可以通过WebREPL上传和运行MicroPython程序。完成后,将NodeMCU UART连接到Arduino UART(数字引脚:10和11)。要查看UART输出,请从Arduino IDE打开串行监视器工具。设置波特9600.您应该看到UART输出:

以下是WebREPL上的程序输出:

ESP32-S的UART2的初始化需要注意的问题

简 介: 在使用ESP32-S的UART2的时候,初始化UART的ID需要设置成1,而不是2,这样可以避免ESP32热启动出现故障。具体原因并不清楚,但可以解决热启动程序执行的问题。在MicroPython输出汉字的时候,需要预先将汉字转换成GBK编码,在送到MicroPython程序完成输出。

关键词 ESP32TTSMicroPython

 

§01 ESP32-S 的TTL-UART


  这两天(2021-05-15)关于语言模块测试中,出现了利用ESP32-S的串口控制TTS功能出现错误的情况,详见:

  下面就对于 ESP32-S模块转接模块 的UART2进行测试。看前面实验中碰到的ESP32-S的UART2输出数据出现的问题原因是什么。

 

§02 试结果


1.测试方法

  使用ESP32-S发送字符串,再利用MAX2323接收相应的信息读取,测试信息是否完整有效。

▲ 使用ESP32-S输出送到MAX2323转接到RS232

▲ 使用ESP32-S输出送到MAX2323转接到RS232

2.测试过程

(1)读取接收字节

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY                     -- by Dr. ZhuoQing 2021-05-15
#
# Note:
#============================================================

from head import *
import serial
from _ast import Or
from serial.serialutil import SerialException

#------------------------------------------------------------
sport = serial.Serial()
sport.baudrate = 9600
sport.timeout = 0.05
try:
    sport.port = 'COM1'
except:
    printf('Set sport port COM1 error. ')

try:
    sport.open()
except serial.serialutil.SerialException:
    printf('Open sport port COM1 error.')
else:
    printf('Open sport port COM1 Ok.')
#------------------------------------------------------------
sport.write(b'<Z>7')
#sport.write(b'<S>1')

while True:
    if sport.inWaiting() > 0:
        printf(sport.read(sport.inWaiting()))

    time.sleep(1)

#------------------------------------------------------------
#        END OF FILE : TEST2.PY
#============================================================

(2)发送MicroPython

from machine                import Pin
import time
from machine                import UART

LED1 = Pin(5, Pin.OUT)
LED2 = Pin(18, Pin.OUT)

uart2 = UART(2, baudrate=9600, tx=17, rx=16)

while True:
    uart2.write('654321')

    time.sleep(3)

(3)接收结果

  在开始的时候,接收到的数据正常。在重新修改程序之后,重新下载程序允许,接收到的数据就是乱码。

Open sport port COM1 Ok.
b'654321'
b'654321'
b'654321'
b'\\x84o\\x11V\\xd79'
b'h\\xb20\\xf6m\\x84'
b'u(pn\\r\\x8a'
b'\\xd3\\x16\\x88z\\xba\\x8d'

  只有对ESP32-S重新上电,也就是将下载线重新插拔一下,就会恢复正常。

3.解决方案

  根据 MicroPtyhon-ESP32 基础教程-UART 对于 UART构造对象的解释,对于UART(id)可以取1,2。

参数描述
id串口编号
bandrate波特率,常用波特率为:9600 115200
databits数据位,是通信中的真正有效信息的每一个字节单元所包含的比特位数。可选的值为 6
parity基础校验方式 ,None不进行校验,0 偶校验 1奇校验
rx接收口的GPIO编号
tx发送口的GPIO编号
stopbit停止位个数
timeout超时时间,取值范围: 0 < timeout ≤ 2147483647

  将初始化的UART的id设置为1,居然能够工作,而且原来的问题不存在了。

from machine                import Pin
import time
from machine                import UART
LED1 = Pin(5, Pin.OUT)
LED2 = Pin(18, Pin.OUT)
uart2 = UART(1, baudrate=9600, tx=17, rx=16)
while True:
    uart2.write('12.3')
    time.sleep(3)

 

§03 制TTS实验


  使用ESP32-S模块触发 语音合成模块 文本转TTS 真人发音 SYN6288 中的语音模块。

▲ 实验中的测试TTS模块

▲ 实验中的测试TTS模块

1.输出字符

  直接输出字符,TTS可以正确读出。

from machine                import Pin
import time
from machine                import UART
LED1 = Pin(5, Pin.OUT)
LED2 = Pin(18, Pin.OUT)
uart2 = UART(1, baudrate=9600, tx=17, rx=16)
while True:
    uart2.write(b'1234')
    time.sleep(3)

2.输出汉字

  输出汉字则出现的问题。使用:

uart2.write(bytes('清华大学', 'gbk'))

  输出读音错误。这说明在MicroPython对于汉字文本编码出现错误。

  使用Python程序将上述汉字输出对应的二进制的数据,将其拷贝纸MicroPython中可以正确读数对应的汉字。

from machine                import Pin
import time
from machine                import UART
LED1 = Pin(5, Pin.OUT)
LED2 = Pin(18, Pin.OUT)
uart2 = UART(1, baudrate=9600, tx=17, rx=16)
while True:
    uart2.write(b'\\xc7\\xe5\\xbb\\xaa\\xb4\\xf3\\xd1\\xa7')
    time.sleep(3)

 

试结论 ※


  试了ESP32-S的UART的MicroPython编程,对于它的UART2使用的过程中,需要在初始化UART函数的时候,将其中id设置为1。这样才能够保证在重新启动(热启动)程序执行正常。否则只能冷启动(重新上电)才能够正确执行。

  至于这为什么,现在还无法解释。只是通过实验说明这种方式可以满足实用要求。

  如果希望MicroPython输出汉字的编码,比如使用“GBK”编码,需要事先使用Python将对应的汉字转换成对应的编码,再使用MicroPython的串口输出,这一点在使用ESP32-s控制TTS模块时有位重要。

 


■ 相关文献链接:

以上是关于MicroPython+ESP8266:UART串口通信的主要内容,如果未能解决你的问题,请参考以下文章

ESP8266 NodeMCU MicroPython 串行垃圾,无法擦除闪存或上传文件

micropython esp8266 烧录

MicroPython ESP32/8266定时器中断示例解析

MicroPython esp8266固件烧写教程

MicroPython ESP8266配网示例以及network模块功能介绍

MicroPython 和 ESP8266 http 服务器请求不完整