Mac终端screen与pyserial接收串口JPEG字符不一致问题排查
问题原因与解决方法
核心问题
串口传输的JPEG是二进制字节流,不是文本数据。你看到的乱码是因为错误地将二进制字节当成文本解码显示,而非串口接收的数据本身有误——你提到的字节十六进制一致,说明pyserial已经正确接收到了原始数据。
为什么screen显示正常?
screen终端会直接将收到的每个字节映射到终端默认的单字节编码(通常是Latin-1/ISO-8859-1),比如:
- 字节
FF对应Latin-1字符ÿ - 字节
D8对应Ø - 字节
E0对应à
这种直接的单字节映射刚好匹配JPEG头的显示效果。
你的Python代码为什么会乱码?
你用decode('charmap')解码字节,Mac系统的charmap并非Latin-1,加上终端默认以UTF-8渲染文本,导致原本的单字节二进制数据被错误解析为UTF-8多字节序列:
- 原始字节
FF被错误解码为UTF-8的C3 BF,对应显示ÿ - 字节
D8解码为C3 98,对应Ø
这就是你看到乱码的根源。
正确处理方式
JPEG是二进制文件,不需要解码成文本,直接保存字节即可:
import serial ser = serial.Serial('/dev/cu.usbserial-5', 115200) # 直接将接收的字节写入文件 with open('received_img.jpg', 'wb') as img_file: while True: # 按块接收,比单字节读取效率更高 chunk = ser.read(1024) if not chunk: break img_file.write(chunk)
如果只是要验证接收的字节是否正确,可以打印字节的十六进制值:
import serial ser = serial.Serial('/dev/cu.usbserial-5', 115200) # 打印前8个字节的十六进制,验证是否为JPEG头 for _ in range(8): b = ser.read(1) print(f"{b.hex()} ", end='') # 正常输出应为:ff d8 ff e0 4a 46 49 46
内容的提问来源于stack exchange,提问作者user58937
相关产品推荐
相关产品推荐

