使用while True下的uart.any() 来获取是否读取,读取到\x04\x04表示结束
显示信息到ST7789 『A LCD』 且输入到设备的数据也显示到『A LCD 』
使用asyncio 异步来实现数据显示
输入信息在另一块ST7789上 『B LCD』
usyncio下UART 和SSD1306 获取数据然后显示
import uasyncio
from machine import UART, I2C, Pin
import ssd1306
i2c = I2C(0, sda=Pin(21), scl=Pin(22))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
uart = UART(2, baudrate=9600, tx=17, rx=16)
q = uasyncio.Queue(maxsize=8) # 消息队列,最多缓存8条消息
async def task_uart_a():
"""A:UART接收任务"""
while True:
if uart.any():
raw = uart.read()
if raw:
s = raw.decode("utf-8","ignore")
# 放入队列,如果队列满,put会自动await阻塞等待队列有空位
await q.put(s)
await uasyncio.sleep(0)
async def task_oled_b():
"""B:SSD1306显示任务"""
while True:
# await get(),没有数据的时候,本任务挂起,事件循环去跑其他任务
msg = await q.get()
oled.fill(0)
oled.text("UART DATA", 0, 0)
# 简单换行处理,适配屏幕
for idx, line in enumerate(msg.split("\n")[:4]):
oled.text(line,0,16 + idx*14)
oled.show()
await uasyncio.sleep(0)
async def main():
uasyncio.create_task(task_uart_a())
uasyncio.create_task(task_oled_b())
await uasyncio.sleep(30)
uasyncio.run(main())