You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAMD51上MicroPython的UART.read()返回不完整(仅2字节)问题

问题分析与解决方案

核心原因

你遇到的问题是MicroPython UART的超时参数设置过短,导致XBee3返回完整响应前就触发了超时,只读取到部分数据。XBee3在返回AT命令响应时,字符之间存在微小间隔,而你当前设置的timeout=1(等待首字符超时1ms)和timeout_char=1(字符间超时1ms)不足以覆盖这个间隔,因此提前终止了读取。

解决步骤

1. 调整UART超时参数

初始化UART时,增大timeout和timeout_char的值,给XBee3足够的时间返回完整响应:

from machine import UART, Pin
# 调整超时为1秒(1000ms),字符间超时为100ms
uart = UART(5, rx=Pin('PB02'), tx=Pin('PB03'), baudrate=115200, timeout=1000, timeout_char=100)

2. 使用readline()替代read()

XBee3的AT命令响应以\r结尾,readline()会自动读取到换行符为止,能确保拿到完整的响应内容:

uart.write('+++')
print(uart.readline())  # 应返回 b'OK\r'

uart.write('ATID\r')
print(uart.readline())  # 应返回 b'FOO\r'

uart.write('ATXX\r')
print(uart.readline())  # 应返回 b'ERROR\r'

3. 额外验证:手动等待后读取

如果调整参数后仍有问题,可以在发送命令后短暂等待,再读取数据:

import time

uart.write('ATID\r')
time.sleep(0.1)  # 等待100ms让XBee生成响应
print(uart.read())

补充说明

  • 直接用电脑串口正常是因为串口工具默认的超时时间更长,能完整接收所有字符。
  • 确保XBee3的命令模式退出正常,若长时间停留在命令模式,可发送ATCN\r退出。

内容的提问来源于stack exchange,提问作者Carlos Mão de Ferro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:50:50