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
相关产品推荐
相关产品推荐

