Python使用pyserial与思科/Aruba交换机串口通信速度慢问题排查
代码导致串口通信过慢的问题分析
- 冗余sleep拖慢整体速度:
run函数内每次执行都固定等待time.sleep(0.5)和time.sleep(0.1),单条指令就有0.6秒的无效等待,10条指令光等待就有6秒开销,这是速度慢的核心原因。 - 串口超时时间设置过长:初始化串口时
timeout=8,如果读不到数据会直接卡8秒,完全超出交换机串口返回的正常耗时。 - 无效的前置操作开销:
run函数开头每次都要先发空换行、读取225字节无用数据,这部分逻辑没有实际作用,额外增加了单条指令的执行时间。 - 回显检测逻辑漏洞:你只将每次readline的最后一行结果赋值给
output,如果交换机返回的关键词不在最后一行,就会检测不到对应执行成功的标记,导致指令重复执行、流程卡住。 - 回显读取不完整:用
ser.inWaiting() > 0作为读取终止条件,很容易因为数据还没完全传输到串口缓冲区就终止读取,回显收不全也会导致检测失败、重复执行。
修复方案
- 删掉所有固定的
time.sleep等待逻辑,改用检测交换机提示符(如用户模式>、特权模式#、配置模式(config)#等)判断上一条指令是否执行完成,避免无效等待。 - 将串口超时时间调整为1~2秒即可,满足极端场景下的等待需求即可,不需要设置8秒这么长。
- 删掉
run函数开头冗余的发空换行、读225字节的逻辑,只保留当前指令的发送和回显读取逻辑。 - 修改回显存储逻辑,将单条指令执行后返回的所有内容拼接存储,再做关键词检测,避免漏检。
- 调整串口读取逻辑,持续读取直到读到对应模式的提示符再停止,确保回显收全。
- 你的指令执行是线性顺序的,可以直接按顺序执行指令,不需要每次判断所有check位,执行完一条确认成功就走下一条,执行效率更高。
核心修改后的代码示例
import serial import threading import time ser = serial.Serial( port='COM9', baudrate=9600, parity='N', stopbits=1, bytesize=8, timeout=1 # 超时改1秒 ) # 读取直到拿到提示符 def read_until_prompt(): res = "" while True: line = ser.readline(100).decode("utf-8", "ignore") if line: res += line # 检测思科常见提示符,匹配到就说明执行完了 if line.strip().endswith(">") or line.strip().endswith("#"): break print(res) return res def run(cmd): # 删掉了所有冗余前置操作 cmd_bytes = str.encode(cmd + '\r\n') ser.write(cmd_bytes) return read_until_prompt() def checkcommands(): # 按顺序执行指令,不需要校验全部check位 output = run("en") if "Password:" in output: run("Admin") run("conf t") run(f"int fa0/{user_text}") run("switchport mode acc") run(f"switchport acc vlan {user_text1}") run("no shut") run("end") run("sh vlan") run("exit") finished = True program = threading.Thread(target=checkcommands) program.start()
内容的提问来源于stack exchange,提问作者CPlusPlusandHTMLguy
相关产品推荐
相关产品推荐

