概述
简 介: 在使用ESP32-S的UART2的时候,初始化UART的ID需要设置成1,而不是2,这样可以避免ESP32热启动出现故障。具体原因并不清楚,但可以解决热启动程序执行的问题。在MicroPython输出汉字的时候,需要预先将汉字转换成GBK编码,在送到MicroPython程序完成输出。
关键词
: ESP32,TTS,MicroPython
§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
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'x84ox11Vxd79'
b'hxb20xf6mx84'
b'u(pnrx8a'
b'xd3x16x88zxbax8d'
只有对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模块
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'xc7xe5xbbxaaxb4xf3xd1xa7')
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
最后
以上就是务实学姐为你收集整理的ESP32-S的UART2的初始化需要注意的问题 §01 ESP32-S 的TTL-UART §02 测试结果 §03 控制TTS实验 ※ 测试结论 ※ 的全部内容,希望文章能够帮你解决ESP32-S的UART2的初始化需要注意的问题 §01 ESP32-S 的TTL-UART §02 测试结果 §03 控制TTS实验 ※ 测试结论 ※ 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复