UART

UART(通用异步收发器)是一种串行通信协议。

  • 用于与外部设备通信:GPS 模块、蓝牙模块、传感器、显示屏等
  • 支持全双工通信(同时收发)
  • 常见波特率:9600, 115200, 250000 等

基本用法

from machine import UART, Pin

# 创建 UART 对象
# UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))
uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))

# 发送数据
uart.write('Hello World\r\n')

# 接收数据
if uart.any():
    data = uart.read()  # 读取所有数据
    print(data)

# 读取指定长度
data = uart.read(10)  # 最多读取 10 字节

# 读取一行
data = uart.readline()  # 读取到 \n 为止

配置参数

# 完整配置示例
uart = UART(
    0,                      # UART 端口号
    baudrate=115200,        # 波特率
    bits=8,                 # 数据位
    parity=None,            # 校验位:None, 0 (偶校验), 1 (奇校验)
    stop=1,                 # 停止位
    tx=Pin(0),              # 发送引脚
    rx=Pin(1)               # 接收引脚
)

发送数据

# 发送字符串
uart.write('Hello\r\n')

# 发送字节
uart.write(b'\x00\x01\x02')

# 发送列表(会被转换为字节)
data = [65, 66, 67]  # ASCII: A, B, C
uart.write(bytes(data))

接收数据

# 检查是否有数据
if uart.any():
    # 读取所有可用数据
    data = uart.read()
    if data:
        # 转换为字符串
        text = data.decode('utf-8')
        print(text)

# 读取指定长度
data = uart.read(5)  # 最多读取 5 字节

# 读取一行
data = uart.readline()
if data:
    print(data.decode('utf-8').strip())

示例1:与 GPS 模块通信

from machine import UART, Pin
import time

# GPS 模块通常使用 9600 波特率
uart = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5))

while True:
    if uart.any():
        line = uart.readline()
        if line:
            try:
                text = line.decode('utf-8')
                # 寻找 GGA 语句(包含位置信息)
                if text.startswith('$GPGGA'):
                    print('GPS 数据:', text.strip())
            except UnicodeError:
                pass
    time.sleep(0.1)

示例2:与蓝牙模块通信(HC-05/HC-06)

from machine import UART, Pin
import time

# 蓝牙模块通常使用 9600 波特率
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

print('等待蓝牙连接...')

while True:
    # 接收蓝牙数据
    if uart.any():
        data = uart.read()
        if data:
            text = data.decode('utf-8').strip()
            print('收到:', text)

            # 回复
            uart.write('收到: ' + text + '\r\n')

    # 发送测试数据
    time.sleep(5)
    uart.write('测试消息\r\n')
    print('发送: 测试消息')

示例3:串口调试助手

from machine import UART, Pin
import time

# 配置 UART
uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))
print('串口调试助手 - 按 Ctrl+C 退出')
print('输入消息后按回车发送')

try:
    while True:
        # 接收数据
        if uart.any():
            data = uart.read()
            if data:
                text = data.decode('utf-8')
                print('接收:', text, end='')

        # 发送数据(如果支持 input)
        # 注意:在 MicroPython 中,input() 可能会阻塞
        # 这里仅作示例
        # msg = input('发送: ')
        # uart.write(msg + '\r\n')

        time.sleep(0.1)
except KeyboardInterrupt:
    print('\n退出')

注意事项

  • 波特率:必须与通信设备一致
  • 引脚:确保 tx 和 rx 正确连接(交叉连接:本设备 tx 接对方 rx)
  • 数据格式:默认 8N1(8 数据位,无校验,1 停止位)
  • 缓冲区:UART 有接收缓冲区,数据会暂存在那里
  • 超时:读取操作可能会阻塞,建议使用 uart.any() 检查
  • 编码:发送字符串时会自动编码为字节,接收时需要解码