UART 串口模块新思路 uasyncio异步

使用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())
此条目发表在None分类目录。将固定链接加入收藏夹。

发表回复