ESP32上MicroPython使用开发板自带USB转UART0通信

发布时间 2023-04-10 10:41:54作者: 不才狸子

鱼和熊掌可以兼得

ESP32或者ESP8266开发板自带USB转串口,连接到UART0。一般只用来下载程序和打印调试信息。使用MicroPython时这个串口用来和REPL通信。现在希望直接接收电脑发出的RGB灯带的二进制数据,使用这个串口省去再使用一个USB转串口芯片。

基本方法

在网上找到别人说使用uos.dupterm(None, 1)来将REPL从UART0分离,尝试后返回ValueError: invalid dupterm index,看到一篇19年的帖子讨论 Trying to disable REPL from Uart0 on ESP32 貌似这种用法不受支持了,但是同时提到了下面的用法

import sys
buf = bytearray(sys.stdin.buffer.read(10))  # 读取10byte的数据
sys.stdout.buffer.write(buf)

屏蔽键盘中断

经测试确实可以直接读写二进制数据了……吗?后来我发现调小RGB灯带亮度的时候有几率卡死,需要按rst复位。我的程序是循环从这个buffer读取数据的,我发现卡死的时候出现了键盘Ctrl + C的中断退出了我的main.py,看来是数据里有出现了和这个中断相同的数据。(小知识:可以使用另一个USB转串口的RX第三者插足到需要监视的UART通信,不论是TX还是RX)
继续查了module-micropython "micropython: access and control MicroPython internals
,可以屏蔽捕获Ctrl+C中断

# 禁用 Crtl+C
micropython.kbd_intr(-1)
# 恢复
micropython.kbd_intr(3)

恢复REPL

但是问题又来了,main.py一上电就进入死循环读buffer,还屏蔽了Ctrl+C中断。不仅REPL没法用,下载程序也没法下了。于是我想了一个办法,通过短接引脚切换工作模式,在main.py里面判断引脚是否拉低来选择进入死循环或REPL。

import micropython
from machine import Pin

mode_pin = Pin(13, Pin.IN, Pin.PULL_UP)

if mode_pin.value() == 0:
    micropython.kbd_intr(-1)
    while True:
        tpm2.tpm2()

用跳线帽短接了引脚13和GND

正好之前买的跳线帽有好多,这样就实现了短接进入灯带控制器模式,不短接进入REPL正常烧录程序