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

news/2024/11/17 20:45:33/

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

关键词 ESP32TTSMicroPython

 

§01 ESP32-S 的TTL-UART


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

  • 语音合成模块 文本转TTS 真人发音 SYN6288
  • 中文TTS文字转语音合成模块合成成品带喇叭 替代SYN6288和XFS5152

  下面就对于 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 UARTLED1 = 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模块时有位重要。

 


■ 相关文献链接:

  • 语音合成模块 文本转TTS 真人发音 SYN6288
  • 中文TTS文字转语音合成模块合成成品带喇叭 替代SYN6288和XFS5152
  • ESP32-S模块转接板设计与实现
  • MicroPtyhon-ESP32 基础教程-UART

http://www.ppmy.cn/news/774590.html

相关文章

xgboost

Xgboost 概念内容介绍来自七月在线头条号&#xff1a; xgboost一直在竞赛江湖里被传为神器&#xff0c;比如时不时某个kaggle/天池比赛中&#xff0c;某人用xgboost于千军万马中斩获冠军。 RF和GBDT是工业界大爱的模型&#xff0c;Xgboost 是大杀器包裹&#xff0c;Kaggle各…

时隔十年,再次上路 LRU缓存

这个博客是为了十年前找工作时候创建的&#xff0c;用来记录自己的积累&#xff0c;没想到&#xff0c;一晃十年&#xff0c;我又回到了这里&#xff0c;想Mark下&#xff0c;时光弹指一瞬&#xff0c;令人唏嘘。 记录一道代码题吧。 力扣 Problem: 146. LRU 缓存 思路 解题…

硬件电路设计--运算放大器(一)参数和分类

文章目录 前言一、运放分类1.1 功能分类1.2 按单颗IC封装1.3 第一脚的判断 二、运放参数2.1 理想运放2.2 实际运放2.3 数据手册中的重要参数2.3.1 供电电压Vs&#xff08;power supply&#xff09;2.3.2 虚短虚断2.3.3 输入偏置电流Ib2.3.4 噪声Vn2.3.5 静态电流IQ2.3.6 输入失…

lotus-shed 更改 Owner

lotus-shed 更改 Owner # lotus-shed actor set-owner --help NAME:lotus-shed actor set-owner - Set owner address (this command should be invoked twice, first with the old owner as the senderAddress, and then with the new owner)USAGE:lotus-shed actor set-owne…

组装一台计算机的配置,要不要自己动手组装一台电脑?一文告诉你答案!

如今&#xff0c;自己动手组装一台电脑成为了越来越多小伙伴的选择&#xff0c;最重要的原因就是因为DIY经济实惠&#xff0c;同样的一台电脑在电脑城可能要花费5000块&#xff0c;而自己从网上买配件组装的话可能4000多块就可以拿下&#xff0c;这节省的1000块可以让我们做很多…

组装电脑什么配置才适合自己

我是小虾&#xff0c;非常高兴又很大家见面&#xff0c;今天跟大家说下&#xff0c;组装电脑什么配置好这个问题&#xff0c;其实非常的简单各有各的需求吧&#xff0c;也没有什么好的坏的&#xff0c;实用就好。按自己的需求来选择电脑配置这才是最人性化的&#xff0c;大家不…

组装一台计算机必需的配件有,哪位可以告诉我自己想组装一台电脑需要那些配件...

雨季871 回答数&#xff1a;8655 | 被采纳数&#xff1a;0 2016-11-29 12:24:29 组装电脑需要的配件&#xff1a; 1、主板 电脑机箱主板&#xff0c;又叫主机板(mainboard)、系统板(systemboard)或母板(motherboard)&#xff1b;它分为商用主板和工业主板两种。它安装在机箱内…

Linux: network: tcp:如何主动从外围kill socket ;ss -K;CONFIG_INET_DIAG_DESTROY

文章目录 参考ss 命令引进的commit依赖 INET_DIAG_DESTROY 这个配置参考 https://www.man7.org/linux/man-pages/man8/ss.8.html ss 命令 .diag_destroy = tcp_abort, -K, --kill 这个参数可以强制从外围关闭sockets。如果关闭成功,就会显示这些关闭成功的sockets。如果内核…