173 lines
4.8 KiB
Python
173 lines
4.8 KiB
Python
|
|
#!/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()
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|