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

使用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)

关键修改点说明

  1. 添加串口超时:timeout=0.1让readline()在无数据时最多等待0.1秒就返回,确保程序能周期性回到按键检测逻辑,不会卡死。
  2. 调整执行顺序:先检查按键状态,再读取串口数据,保证按键检测不会被串口读取阻塞。
  3. 修复编码问题:去掉重复的decode调用,添加errors='ignore'避免编码错误导致程序崩溃。
  4. Python3语法适配:替换raw_input为input,修正串口端口字符串的引号问题。

内容的提问来源于stack exchange,提问作者Aditya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:05:21