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

MicroPython自动将回车转为换行?Raspberry Pi Pico终端输入异常问询

问题分析:Windows终端回车在Raspberry Pi Pico MicroPython中被解析为两个LF

问题复现

在Windows环境下,使用配置为发送CRLF(0x0D+0x0A)的PuTTY、Thonny Shell或PyCharm的MicroPython插件连接运行v1.19.1版本MicroPython的Raspberry Pi Pico时,按下回车键,Pico端通过以下测试代码读取到的是两个换行符(0x0A+0x0A),而非预期的CR+LF:

import sys

while(True):
    b = sys.stdin.read(1)
    sys.stdout.write("(" + hex(ord(b)) + ")")

原因解析

这是MicroPython串口REPL的默认文本模式行处理特性,并非操作错误或Bug:

  • MicroPython的sys.stdin默认以文本模式工作,会自动将收到的回车符(CR,0x0D)转换为换行符(LF,0x0A)。
  • 当Windows终端(或终端工具)按下回车时,默认发送CRLF(0x0D+0x0A),此时REPL会把其中的0x0D转换为0x0A,加上原本的0x0A,最终就出现了两个0x0A的输出。

解决方法

如果需要读取原始的串口输入字节(跳过行尾转换),可以使用sys.stdin.buffer以二进制模式读取,它不会对输入做任何行尾转换处理:

修改后的测试代码

import sys

while True:
    b = sys.stdin.buffer.read(1)
    if b:
        sys.stdout.write(f"({hex(ord(b))})")
        sys.stdout.flush()  # 强制刷新输出缓冲区,确保结果即时显示

运行这段代码后,按下回车键就能正确读取到终端发送的0x0D和0x0A,输出为(0xd)(0xa)。另外,部分终端工具(如Thonny)本身在与Pico通信时会额外做行尾转换,使用二进制读取方式也能规避这个叠加效应。

内容的提问来源于stack exchange,提问作者sandyscott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:01:08