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

