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

如何让Python持续读取Arduino串口数据而非仅读取一次后终止?

问题解决方案

1. 程序仅执行一次就终止的问题

当前代码只读取了一次串口数据,执行完逻辑后直接退出。要实现持续监听门状态的需求,必须添加循环结构来持续读取串口数据:

2. 热键不生效的问题

  • 权限问题:Windows环境下,pyautogui发送系统热键可能需要以管理员权限运行Python程序,同时要关闭可能拦截热键的软件(如部分杀毒工具、桌面管理软件)。
  • 热键功能匹配错误:你的代码注释存在错误——win+d是显示/隐藏桌面,并非切换左侧桌面;切换左侧桌面应使用win+ctrl+left;alt+tab是切换窗口,若需求是切换右侧桌面则需改为win+ctrl+right。
  • 串口初始化延迟:Arduino上电后有短暂初始化时间,直接读取可能丢失初始数据,需添加初始化延迟。

修改后的完整代码

import pyautogui as pa
import serial
import time

# 初始化串口,添加2秒等待让Arduino完成上电初始化
ser = serial.Serial("COM4", 9600)
time.sleep(2)

try:
    # 持续监听串口数据
    while True:
        # 检查串口是否有数据待读取,避免阻塞程序
        if ser.in_waiting > 0:
            data_raw = ser.read()
            int_val = int.from_bytes(data_raw, "big")
            print(int_val)

            if int_val == 49:
                # 切换到左侧桌面,若需显示桌面则改为pa.hotkey('win','d')
                pa.hotkey('win', 'ctrl', 'left')
            elif int_val == 50:
                # 切换窗口,若需切换右侧桌面则改为pa.hotkey('win','ctrl','right')
                pa.hotkey('alt', 'tab')
        # 短延迟降低CPU占用
        time.sleep(0.1)
except KeyboardInterrupt:
    # 捕获Ctrl+C信号,退出时关闭串口避免资源占用
    ser.close()
    print("程序已退出")

额外说明

  • 加入ser.in_waiting判断,确保有数据时才读取,避免程序无意义阻塞。
  • 通过try-except捕获中断信号,退出时自动关闭串口,防止串口被占用导致后续无法连接。
  • 修正了热键与功能的对应关系,确保代码逻辑和实际需求匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:15:24