impress_sig_mesh_hacs/test_serial.py
2026-04-17 14:06:30 +08:00

142 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 线是否完好")