Python将RS232串口读取的字节串转UTF-8出现解码错误如何解决
问题原因
- 太阳能控制器通过RS232返回的是自定义二进制协议数据,不是UTF-8编码的明文文本,直接强行解码自然会抛出编码错误。
- 现有代码存在冗余操作:
msg本身就是原始字节,先转十六进制字符串再转回字节的操作没有任何实际意义,可以直接省略。
解决思路
1. 先确认串口参数配置正确
首先核对你打开串口时设置的波特率、数据位、停止位、校验位是否和设备要求一致,参数不匹配会导致读取到的全是错误数据,后续根本无法解析。
2. 查找设备通信协议
优先找该型号控制器的官方通信协议文档,这类工业设备大多遵循Modbus RTU协议,你可以先按Modbus帧规则验证:
- 标准Modbus RTU帧结构为:
从站地址(1字节) + 功能码(1字节) + 数据域(N字节) + CRC校验码(2字节) - 你可以提取当前字节串的最后两个字节做CRC16校验,如果校验通过就可以确认是Modbus协议,后续按协议规则解析对应寄存器的值即可。
3. 调试用容错解码方案
如果暂时找不到协议,只想排查数据中是否存在明文片段,可以使用容错解码避免报错:
msg = b'y\xbd\xd5\xdd\xb5\x9f\x0f}\x9f\x97\x8d\xe5\xebsQ\xed\x9d\x9d\x93\xe5\xebYu[\xb9\xedo]\x9d\x95\x97\x9bi\x99\x93KU\xe5\xebS\xed\x9d\x9b\x91\x9f\x9f\xe5\xebm\xed\x9f\x00y\xbd\xaa5\xd5\x99\x93\x97\x9f\x9f\xe5\xeb__S\xed\x9f\xe5\xebyY\xed\x9f\xe5\xebu[[\xed\x9f\xe5\xebo\x9d\x8d\xed\x95\x8d\x9d\x91\x8d\xe5\xebo\x9b\x9f\xed\x95\x95\xe5\xebo\x9b\x9d\xed\x99\x9f\x8d\x00y\xbdk\xb6\xd6\x95\x95\xe5\xebo\x9b\x99\xed\x9d\x93\x95\xe5\xeboYwY\xed\x8f\x99\xe5\xeby/59)\x19\x15%\xed\xfd\x00' # 打印原始十六进制串,方便后续对照协议解析 print("原始十六进制数据:", msg.hex()) # UTF-8容错解码,无法识别的字节用�替代 print("UTF-8容错解码结果:", msg.decode('utf-8', errors='replace')) # 也可以尝试老设备常用的GBK编码解码 print("GBK容错解码结果:", msg.decode('gbk', errors='replace'))
内容的提问来源于stack exchange,提问作者Frodo
相关产品推荐
相关产品推荐

