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

Python Serial运行时修改串口奇偶校验位异常问题求助

Python Serial运行时修改串口奇偶校验位异常问题求助

看起来你遇到的问题是pyserial在运行时修改奇偶校验位后,新配置没有正确生效导致的,尤其是奇校验模式下出现了数据乱码。我来给你几个可行的解决方案:

问题根源分析

直接修改ser.parity属性后,很多情况下串口驱动并不会立即应用新的配置,这是因为底层的串口参数需要重新同步,尤其是在Windows平台上,这种热修改的兼容性相对差一些。

解决方案一:调用apply_settings()生效新配置

pyserial从3.0版本开始提供了apply_settings()方法,专门用来让修改后的串口参数生效。你可以在修改奇偶校验位后调用这个方法:

import serial
import time
ser = serial.Serial(
    port='COM3',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=0
)
time.sleep(2)

while True:
    ser.parity = serial.PARITY_ODD
    ser.apply_settings()  # 关键:让新的奇偶校验配置生效
    ser.write(serial.to_bytes([0x01, 0x02, 0x03, 0x01, 0x02, 0x03]))
    time.sleep(2)

解决方案二:关闭后重新打开串口(兼容性更强)

如果你的pyserial版本比较旧,或者apply_settings()方法不起作用,最稳妥的方式是关闭当前串口连接,然后用新的奇偶校验参数重新打开:

import serial
import time
# 初始串口配置
ser_config = {
    'port': 'COM3',
    'baudrate': 9600,
    'stopbits': serial.STOPBITS_ONE,
    'bytesize': serial.EIGHTBITS,
    'timeout': 0
}
ser = serial.Serial(**ser_config)
time.sleep(2)

while True:
    ser.close()
    # 更新奇偶校验位后重新打开
    ser_config['parity'] = serial.PARITY_ODD
    ser = serial.Serial(**ser_config)
    time.sleep(0.1)  # 给串口留一点初始化时间
    ser.write(serial.to_bytes([0x01, 0x02, 0x03, 0x01, 0x02, 0x03]))
    time.sleep(2)

额外注意事项

  • 升级pyserial版本:旧版本的pyserial在运行时修改串口参数存在已知bug,建议升级到最新版本:
    pip install --upgrade pyserial
    
  • 接收端配置必须完全匹配:务必确保接收端的串口参数(波特率、奇偶校验、停止位、数据位)和你发送端修改后的配置完全一致,否则必然会出现乱码。
  • 硬件兼容性:部分老旧的串口设备可能不支持热切换奇偶校验位,这种情况下只能通过重新初始化串口来切换配置。

备注:内容来源于stack exchange,提问作者Sathish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:39:34