魚和熊掌可以兼得
ESP32或者ESP8266開發(fā)板自帶USB轉(zhuǎn)串口,連接到UART0。一般只用來下載程序和打印調(diào)試信息。使用MicroPython時(shí)這個(gè)串口用來和REPL通信。現(xiàn)在希望直接接收電腦發(fā)出的RGB燈帶的二進(jìn)制數(shù)據(jù),使用這個(gè)串口省去再使用一個(gè)USB轉(zhuǎn)串口芯片。
基本方法
在網(wǎng)上找到別人說使用uos.dupterm(None, 1)
來將REPL從UART0分離,嘗試后返回ValueError: invalid dupterm index
,看到一篇19年的帖子討論 Trying to disable REPL from Uart0 on ESP32 貌似這種用法不受支持了,但是同時(shí)提到了下面的用法
import sys
buf = bytearray(sys.stdin.buffer.read(10)) # 讀取10byte的數(shù)據(jù)
sys.stdout.buffer.write(buf)
屏蔽鍵盤中斷
經(jīng)測試確實(shí)可以直接讀寫二進(jìn)制數(shù)據(jù)了……嗎?后來我發(fā)現(xiàn)調(diào)小RGB燈帶亮度的時(shí)候有幾率卡死,需要按rst復(fù)位。我的程序是循環(huán)從這個(gè)buffer讀取數(shù)據(jù)的,我發(fā)現(xiàn)卡死的時(shí)候出現(xiàn)了鍵盤Ctrl + C的中斷退出了我的main.py,看來是數(shù)據(jù)里有出現(xiàn)了和這個(gè)中斷相同的數(shù)據(jù)。(小知識:可以使用另一個(gè)USB轉(zhuǎn)串口的RX第三者插足到需要監(jiān)視的UART通信,不論是TX還是RX)
繼續(xù)查了module-micropython "micropython: access and control MicroPython internals
,可以屏蔽捕獲Ctrl+C中斷
# 禁用 Crtl+C
micropython.kbd_intr(-1)
# 恢復(fù)
micropython.kbd_intr(3)
恢復(fù)REPL
但是問題又來了,main.py
一上電就進(jìn)入死循環(huán)讀buffer,還屏蔽了Ctrl+C中斷。不僅REPL沒法用,下載程序也沒法下了。于是我想了一個(gè)辦法,通過短接引腳切換工作模式,在main.py里面判斷引腳是否拉低來選擇進(jìn)入死循環(huán)或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()
正好之前買的跳線帽有好多,這樣就實(shí)現(xiàn)了短接進(jìn)入燈帶控制器模式,不短接進(jìn)入REPL正常燒錄程序