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

