From 520b8818cd71e60ada98f2e60b9df33823d0eb48 Mon Sep 17 00:00:00 2001 From: ray <1416431931@qq.com> Date: Wed, 12 Nov 2025 00:48:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=AE=E9=BC=A0=E5=86=B2?= =?UTF-8?q?=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main_single.py | 125 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 92 insertions(+), 33 deletions(-) diff --git a/main_single.py b/main_single.py index 892a4fe..b1a3e53 100644 --- a/main_single.py +++ b/main_single.py @@ -133,25 +133,76 @@ def run_automation_for_group(group_index): best_point = p return best_point + def safe_keyboard_send(data, max_retries=3): + """安全的键盘发送函数,带重试机制""" + nonlocal keyboard + for attempt in range(max_retries): + try: + keyboard.send_data(data) + return True + except (serial.serialutil.SerialException, PermissionError, OSError) as e: + if attempt < max_retries - 1: + print(f"⚠️ 键盘发送失败 (尝试 {attempt + 1}/{max_retries}): {e}") + time.sleep(0.1 * (attempt + 1)) # 递增延迟 + # 尝试重新初始化串口 + try: + if serial.ser and serial.ser.is_open: + serial.ser.close() + time.sleep(0.2) + init_mouse_keyboard(group) + # 重新创建keyboard对象 + keyboard = ch9329Comm.keyboard.DataComm() + except Exception as init_e: + print(f"⚠️ 重新初始化串口失败: {init_e}") + else: + print(f"❌ 键盘发送失败,已重试 {max_retries} 次: {e}") + raise + return False + + def safe_keyboard_release(max_retries=3): + """安全的键盘释放函数,带重试机制""" + nonlocal keyboard + for attempt in range(max_retries): + try: + keyboard.release() + return True + except (serial.serialutil.SerialException, PermissionError, OSError) as e: + if attempt < max_retries - 1: + time.sleep(0.1 * (attempt + 1)) + # 尝试重新初始化串口 + try: + if serial.ser and serial.ser.is_open: + serial.ser.close() + time.sleep(0.2) + init_mouse_keyboard(group) + keyboard = ch9329Comm.keyboard.DataComm() + except Exception as init_e: + print(f"⚠️ 重新初始化串口失败: {init_e}") + else: + print(f"⚠️ 键盘释放失败: {e}") + # 释放失败不算致命错误,继续执行 + return False + return False + def move_randomly(rw, k): k = k % 4 suiji_t = float(random.randint(10, 13) / 10) if k == 0: - keyboard.send_data("66") - time.sleep(suiji_t) - keyboard.release() + if safe_keyboard_send("66"): + time.sleep(suiji_t) + safe_keyboard_release() elif k == 1: - keyboard.send_data("88") - time.sleep(suiji_t) - keyboard.release() + if safe_keyboard_send("88"): + time.sleep(suiji_t) + safe_keyboard_release() elif k == 2: - keyboard.send_data("44") - time.sleep(suiji_t) - keyboard.release() + if safe_keyboard_send("44"): + time.sleep(suiji_t) + safe_keyboard_release() elif k == 3: - keyboard.send_data("22") - time.sleep(suiji_t) - keyboard.release() + if safe_keyboard_send("22"): + time.sleep(suiji_t) + safe_keyboard_release() return k + 1 def move_to(rw, mb): @@ -159,22 +210,22 @@ def run_automation_for_group(group_index): nonlocal v v = group['move_velocity'] if rw[0] >= mb[0]: - keyboard.send_data("44") - time.sleep(float(abs(rw[0] - mb[0]) / v)) - keyboard.release() + if safe_keyboard_send("44"): + time.sleep(float(abs(rw[0] - mb[0]) / v)) + safe_keyboard_release() else: - keyboard.send_data("66") - time.sleep(float(abs(rw[0] - mb[0]) / v)) - keyboard.release() + if safe_keyboard_send("66"): + time.sleep(float(abs(rw[0] - mb[0]) / v)) + safe_keyboard_release() if rw[1] >= mb[1]: - keyboard.send_data("88") - time.sleep(float(abs(rw[1] - mb[1]) / v)) - keyboard.release() + if safe_keyboard_send("88"): + time.sleep(float(abs(rw[1] - mb[1]) / v)) + safe_keyboard_release() else: - keyboard.send_data("22") - time.sleep(float(abs(rw[1] - mb[1]) / v)) - keyboard.release() + if safe_keyboard_send("22"): + time.sleep(float(abs(rw[1] - mb[1]) / v)) + safe_keyboard_release() # 主循环 print(f"🔄 配置组 {group['name']} 开始自动化循环...") @@ -225,9 +276,9 @@ def run_automation_for_group(group_index): elif detections['npc4'] is not None: if sq(detections['npc4'], rw) < 50: print(f"[{group['name']}] 离npc4很近 直接进入") - keyboard.send_data("DD") - time.sleep(0.15) - keyboard.release() + if safe_keyboard_send("DD"): + time.sleep(0.15) + safe_keyboard_release() time.sleep(1) im_opencv = get_image.get_frame() if im_opencv and shizi.daoying(im_opencv[0]): @@ -271,9 +322,9 @@ def run_automation_for_group(group_index): if len(detections['daojv']) != 0: move_to(rw, process_points(detections['daojv'])) for i in range(3 + len(detections['daojv'])): - keyboard.send_data("AA") - time.sleep(0.15) - keyboard.release() + if safe_keyboard_send("AA"): + time.sleep(0.15) + safe_keyboard_release() continue if shizi.tuichu(im_opencv[0]) and detections['next'] is None and len(detections['daojv']) == 0 and len(detections['gw']) == 0 and boss_pd: print(f"[{group['name']}] 识别到可以退出挑战!!!!!!!!!!!!!!!!!!") @@ -328,9 +379,9 @@ def run_automation_for_group(group_index): panduan = True move_to(rw, detections['next']) for i in range(2): - keyboard.send_data("DD") - time.sleep(0.15) - keyboard.release() + if safe_keyboard_send("DD"): + time.sleep(0.15) + safe_keyboard_release() continue else: k = move_randomly(rw, k) @@ -347,6 +398,14 @@ def run_automation_for_group(group_index): import traceback traceback.print_exc() time.sleep(1) + + # 清理资源 + try: + if serial.ser and serial.ser.is_open: + serial.ser.close() + print(f"✅ 配置组 {group['name']} 串口已关闭") + except Exception as e: + print(f"⚠️ 关闭串口时出错: {e}") if __name__ == "__main__": if len(sys.argv) > 1: