#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 激光模块测试脚本 用于诊断激光开关问题 使用方法: python test_laser.py 功能: 1. 初始化串口 2. 循环测试激光开/关 3. 打印详细调试信息 """ from maix import uart, pinmap, time # ==================== 配置 ==================== UART_PORT = "/dev/ttyS1" # 激光模块连接的串口(UART1) BAUDRATE = 9600 # 波特率 # 引脚映射(确保与硬件连接一致) print("=" * 50) print("🔧 步骤1: 配置引脚映射") print("=" * 50) try: pinmap.set_pin_function("A18", "UART1_RX") print("✅ A18 -> UART1_RX") except Exception as e: print(f"❌ A18 配置失败: {e}") try: pinmap.set_pin_function("A19", "UART1_TX") print("✅ A19 -> UART1_TX") except Exception as e: print(f"❌ A19 配置失败: {e}") # ==================== 激光控制指令 ==================== MODULE_ADDR = 0x00 # 原始命令 LASER_ON_CMD = bytes([0xAA, MODULE_ADDR, 0x01, 0xBE, 0x00, 0x01, 0x00, 0x01, 0xC1]) LASER_OFF_CMD = bytes([0xAA, MODULE_ADDR, 0x01, 0xBE, 0x00, 0x01, 0x00, 0x00, 0xC0]) # 备用命令格式(如果原始命令不工作,可以尝试这些) # 格式1: 简化命令 LASER_ON_CMD_ALT1 = bytes([0xAA, 0x01, 0x01]) LASER_OFF_CMD_ALT1 = bytes([0xAA, 0x01, 0x00]) # 格式2: 不同的协议头 LASER_ON_CMD_ALT2 = bytes([0x55, 0xAA, 0x01]) LASER_OFF_CMD_ALT2 = bytes([0x55, 0xAA, 0x00]) print("\n" + "=" * 50) print("🔧 步骤2: 初始化串口") print("=" * 50) print(f"设备: {UART_PORT}") print(f"波特率: {BAUDRATE}") try: laser_uart = uart.UART(UART_PORT, BAUDRATE) print(f"✅ 串口初始化成功: {laser_uart}") except Exception as e: print(f"❌ 串口初始化失败: {e}") exit(1) # ==================== 测试函数 ==================== def send_and_check(cmd, name): """发送命令并检查回包""" print(f"\n📤 发送: {name}") print(f" 命令字节: {cmd.hex()}") print(f" 命令长度: {len(cmd)} 字节") # 清空接收缓冲区 try: old_data = laser_uart.read(-1) if old_data: print(f" 清空缓冲区: {len(old_data)} 字节") except: pass # 发送命令 try: written = laser_uart.write(cmd) print(f" 写入字节数: {written}") except Exception as e: print(f" ❌ 写入失败: {e}") return None # 等待响应 time.sleep_ms(100) # 读取回包 try: resp = laser_uart.read(50) if resp: print(f" 📥 收到回包: {resp.hex()} ({len(resp)} 字节)") return resp else: print(f" ⚠️ 无回包") return None except Exception as e: print(f" ❌ 读取失败: {e}") return None def test_laser_cycle(on_cmd, off_cmd, cmd_name="标准命令"): """测试一个开关周期""" print(f"\n{'='*50}") print(f"🧪 测试 {cmd_name}") print(f"{'='*50}") print("\n>>> 测试开启激光") send_and_check(on_cmd, f"{cmd_name} - 开启") print(" ⏱️ 等待 2 秒观察激光是否亮起...") time.sleep(2) print("\n>>> 测试关闭激光") send_and_check(off_cmd, f"{cmd_name} - 关闭") print(" ⏱️ 等待 2 秒观察激光是否熄灭...") time.sleep(2) # ==================== 主测试 ==================== print("\n" + "=" * 50) print("🚀 开始激光测试") print("=" * 50) print("\n请观察激光模块的状态变化...") print("测试将依次尝试不同的命令格式\n") try: # 测试1: 标准命令 test_laser_cycle(LASER_ON_CMD, LASER_OFF_CMD, "标准命令") input("\n按回车继续测试备用命令1...") # 测试2: 备用命令格式1 test_laser_cycle(LASER_ON_CMD_ALT1, LASER_OFF_CMD_ALT1, "备用命令1 (简化)") input("\n按回车继续测试备用命令2...") # 测试3: 备用命令格式2 test_laser_cycle(LASER_ON_CMD_ALT2, LASER_OFF_CMD_ALT2, "备用命令2 (0x55AA头)") print("\n" + "=" * 50) print("🏁 测试完成") print("=" * 50) print("\n诊断建议:") print("1. 如果激光始终不亮/始终亮:") print(" - 检查激光模块的电源连接") print(" - 检查串口TX/RX是否接反") print(" - 尝试不同的波特率 (4800/19200)") print("") print("2. 如果有回包但激光无反应:") print(" - 命令格式可能正确但激光硬件问题") print("") print("3. 如果某个备用命令有效:") print(" - 需要更新 config.py 中的命令格式") except KeyboardInterrupt: print("\n\n🛑 测试被中断") # 确保激光关闭 laser_uart.write(LASER_OFF_CMD) print("✅ 已发送关闭指令") except Exception as e: print(f"\n❌ 测试出错: {e}") import traceback traceback.print_exc()