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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:20:31