#!/usr/bin/env python3 """串口测试脚本 - 用于诊断 E104-BT12USP 网关通信问题.""" import serial import serial.tools.list_ports import time import sys def list_ports(): """列出可用串口.""" print("=== 可用串口列表 ===") ports = serial.tools.list_ports.comports() for p in ports: print(f" {p.device}: {p.description} ({p.hwid})") return ports def test_hci_mode(device, baudrate=115200): """测试 HCI 模式.""" print(f"\n=== 测试 HCI 模式 ({device}, {baudrate}) ===") try: ser = serial.Serial(device, baudrate, timeout=2) print(f"串口已打开") # 发送 HCI 版本查询 (E9 FF 02 00) cmd = bytes([0xE9, 0xFF, 0x02, 0x00]) print(f"发送 HCI 版本查询:{cmd.hex().upper()}") ser.write(cmd) time.sleep(1) if ser.in_waiting: data = ser.read(ser.in_waiting) print(f"收到响应 ({len(data)} 字节): {data.hex().upper()}") # 尝试解析 91 响应 if data[0] == 0x91: print("✓ 收到 HCI 响应格式 (91 头)") return True else: print("✗ 无响应") ser.close() return False except serial.SerialException as e: print(f"✗ 串口错误:{e}") return False except Exception as e: print(f"✗ 错误:{e}") return False def test_at_mode(device, baudrate=115200): """测试 AT 命令模式.""" print(f"\n=== 测试 AT 命令模式 ({device}, {baudrate}) ===") try: ser = serial.Serial(device, baudrate, timeout=2) print(f"串口已打开") # 发送 AT 命令 cmd = b"AT\r\n" print(f"发送 AT 命令:{cmd!r}") ser.write(cmd) time.sleep(1) if ser.in_waiting: data = ser.read(ser.in_waiting) print(f"收到响应:{data!r}") if b"OK" in data or b"AT+" in data: print("✓ 收到 AT 响应") return True else: print("✗ 无响应") ser.close() return False except serial.SerialException as e: print(f"✗ 串口错误:{e}") return False except Exception as e: print(f"✗ 错误:{e}") return False def monitor_raw(device, baudrate=115200, duration=10): """监听原始串口数据.""" print(f"\n=== 监听原始数据 ({device}, 持续{duration}秒) ===") print("请在其他程序中触发网关发送数据...") try: ser = serial.Serial(device, baudrate, timeout=0.1) start = time.time() while time.time() - start < duration: if ser.in_waiting: data = ser.read(ser.in_waiting) timestamp = time.strftime("%H:%M:%S") print(f"[{timestamp}] 收到 {len(data)} 字节:{data.hex().upper()}") time.sleep(0.01) ser.close() print("监听结束") except Exception as e: print(f"✗ 错误:{e}") if __name__ == "__main__": if len(sys.argv) > 1: device = sys.argv[1] else: ports = list_ports() if not ports: print("未找到串口设备") sys.exit(1) device = ports[0].device baudrate = int(sys.argv[2]) if len(sys.argv) > 2 else 115200 print(f"\n使用设备:{device}, 波特率:{baudrate}") # 测试 HCI 模式 hci_result = test_hci_mode(device, baudrate) # 测试 AT 模式 at_result = test_at_mode(device, baudrate) # 结果总结 print("\n=== 测试结果 ===") print(f"HCI 模式:{'✓ 成功' if hci_result else '✗ 失败'}") print(f"AT 模式:{'✓ 成功' if at_result else '✗ 失败'}") if not hci_result and not at_result: print("\n建议:") print("1. 检查串口权限:ls -l /dev/ttyUSB0") print("2. 确认网关已供电") print("3. 尝试其他波特率 (9600, 38400, 57600)") print("4. 检查 USB 线是否完好")