使用pyserial读取串口数据时,键盘按键无法退出循环的问题
问题分析与解决
根本性错误原因
你的代码核心问题是**sP.readline()是阻塞式操作**:当单片机没有发送数据时,程序会一直卡在这个调用上,完全没机会执行keyboard.is_pressed("e")的按键检测逻辑,所以无法通过按键退出循环。
另外代码还有几个小问题:
data = sP.readline().decode('utf-8')[:-2]已经完成解码,后续print(data.decode("utf-8"))会抛出解码错误raw_input是Python2语法,Python3应使用input()- 串口初始化时
COM10未加引号,会被当作变量而非字符串,导致报错
修复后的代码示例
import serial import time import keyboard # 修复串口初始化引号问题,添加超时设置(关键) sP = serial.Serial(port='COM10', baudrate=9600, bytesize=8, timeout=0.1) while True: # Python3用input替代raw_input sendData = input('Enter Data: ') sP.write(sendData.encode()) time.sleep(1) # 避免重复解码,添加错误忽略防止编码异常 data = sP.readline().decode('utf-8', errors='ignore')[:-2] print(data) if sendData.startswith('1'): print("entering loop") while True: # 优先检测按键,避免被串口读取阻塞 if keyboard.is_pressed("e"): print("program exiting loop") sP.write('22'.encode()) break # 超时设置让readline()最多阻塞0.1秒,保证按键检测能周期性执行 data = sP.readline().decode('utf-8', errors='ignore')[:-2] if data: # 只打印非空数据 print(data)
关键修改点说明
- 添加串口超时:
timeout=0.1让readline()在无数据时最多等待0.1秒就返回,确保程序能周期性回到按键检测逻辑,不会卡死。 - 调整执行顺序:先检查按键状态,再读取串口数据,保证按键检测不会被串口读取阻塞。
- 修复编码问题:去掉重复的
decode调用,添加errors='ignore'避免编码错误导致程序崩溃。 - Python3语法适配:替换
raw_input为input,修正串口端口字符串的引号问题。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

