SmartUSBHub python 库

English

本文档适用型号:SmartUSBHub 产品系列

本文档更新日期:2026年6月4日

简介

  • 使用前请先从 SmartUSBHub 文档 中选择对应产品的使用指南。

  • 如果想直接用软件控制,请使用随 SmartUSBHub 发行包提供的配套控制软件。

  • 这是一个用于在脚本、测试系统和自动化流程中控制 SmartUSBHub 设备的 Python 库。

产品概述

SmartUSBHub 是一系列可编程 USB 集线器,支持按通道控制电源;部分型号支持数据线控制,部分型号支持电压/电流检测。该系列产品适用于开发、自动化测试和设备管理。

  1. 独立电源/数据控制,模拟热插拔: SmartUSBHub 每个下游端口支持 电源(VBUS)数据(D+ / D-) 的独立控制,可通过指令模拟物理插拔USB设备 。工程师无需手动插拔即可远程控制USB设备的连接/断开,实现自动化测试或远程重启设备,极大提升调试和测试效率。

  2. 电压/电流监测: 支持电流电压检测的型号提供每通道实时电压、电流采集功能。这意味着用户可以随时监控各被测设备的供电电压及电流,辅助进行设备功耗分析与状态监测。在测试中若出现异常电压跌落或电流过载,工程师能够及时发现并定位问题。

  3. 开源软件生态,易于集成: SmartUSBHub 提供了开源的协议、控制软件和 Python 控制库,兼容 Windows/macOS/Linux 等主流操作系统 。得益于标准串口指令接口和开放的API,用户可将其无缝集成到现有的自动化测试平台或脚本中(通过Python、CLI等),轻松将USB端口控制纳入自动化流程,加速开发测试周期。

  4. 多模式端口管理

  • 支持 普通模式(多通道同时控制)与 互锁模式(仅允许操作一个通道)

  • 每端口可设置 上电默认状态断电状态记忆

  1. 扩展性强

  • 支持集中控制多个SmartUSBHub的拓扑结构

  • 每个设备支持地址配置,适用于级联系统

被行业验证的选择

从消费电子到自动驾驶,从全球领先的消费电子品牌到高性能芯片设计公司,SmartUSBHub 已广泛应用于多个行业头部企业的研发流程、自动化测试系统与产线测试场景中。

SmartUSBHub 目前已被全球 20+ 家行业头部企业广泛采用,其客户涵盖以下代表性领域:

  • 汽车行业

  • 智能手机

  • 半导体与芯片设计

  • 人工智能

  • 通信与物联网

部署

任选一种使用方式。

方法1:直接安装发布包

pip install smartusbhub

方法2:引用当前源码库

cd smartusbhub_ng
python -m venv venv
source ./venv/bin/activate
pip install -r requirements.txt

库目录结构如下:

.
├── README.md					# 文档
├── document					# 产品使用指南
├── examples					# 例程
├── requirements.txt	# 安装依赖
└── smartusbhub.py 		# 功能源码

GUI 示例需要额外依赖:

pip install pyqtgraph PyQt5 numpy

运行例程

smartusbhub库包含多个例程,其存放在examples目录下,目前有以下例子:

  • power_control_example.py:控制通道电源,包括互锁模式

  • setting_example.py:读取设备信息,配置默认状态、地址、工作模式和按钮

  • cycle_all_channels.py:依次对每个可控通道进行上下电循环

  • set_default_power_dataline_on.py:配置上电默认状态

  • advanced/dataline_control_example.py:保持供电的同时断开/恢复某通道 USB2.0 数据线

  • advanced/power_measurement_oneshot.py:使用请求/响应模式持续测量电压/电流

  • advanced/power_measurement_stream.py:使用流式模式持续测量电压/电流

  • advanced/oscilloscope.py:使用请求/响应测量的 GUI 示波器

  • advanced/oscilloscope_stream.py:使用流式测量模式的 GUI 示波器

  • advanced/oc_monitor_usb2_7p.py:USB2 7P 型号过流监控

  • advanced/user_callback_example.py:注册用户回调

  • advanced/multi_device_channel_control.py:发现并控制多台设备

oscilloscope

图:示波器demo

在包根目录下运行 demo,例如:

python examples/power_control_example.py
python examples/advanced/oscilloscope.py

集成到项目

通过导入 smartusbhub 库即可集成到你的项目之中。

  1. 导入 smartusbhub 库到你的工程:

    from smartusbhub import SmartUSBHub
    
  2. 初始化 SmartUSBHub 实例:

    • 通过自动扫描连接设备:

      hub = SmartUSBHub.scan_and_connect()
      
    • 通过指定串口号连接设备:

      hub = SmartUSBHub("串口路径")
      # 例子:
      hub = SmartUSBHub("/dev/cu.usbmodem132301")
      

用户接口

设备连接

scan_and_connect()

  • 描述: 扫描可用的 Smart USB Hub 设备,并连接到第一个有效设备。

  • 返回值:

    • SmartUSBHub 实例(如果找到设备),否则返回 None

  • 示例:

    hub = SmartUSBHub.scan_and_connect()
    

connect(port)

  • 描述: 连接到指定的Smart USB Hub 设备。

  • 参数:

    • port: 要连接的串口名称。

  • 示例:

    hub.connect("/dev/cu.usbmodem132301")
    

设备断开链接

disconnect()

  • 描述:断开当前的Smart USB Hub 设备。

  • 示例:

    hub.disconnect()
    

获取通道列表

get_channels()

  • 描述: 返回当前连接产品的所有有效通道编号,通道编号从 1 开始。

  • 返回值:

    • tuple: 当前设备可用通道,例如 (1, 2, 3, 4)(1, 2, 3, 4, 5, 6, 7)

  • 示例:

    channels = hub.get_channels()
    hub.set_channel_power(*channels, state=1)
    

控制通道电源开关

set_channel_power(*channels, state)

  • 描述: 设置指定通道的电源状态。

  • 参数:

    • *channels (int): 要控制的通道。

    • state (int): 1 开启电源,0 关闭电源。

  • 返回值:

    • bool: 如果命令设置成功返回 True,否则返回 False

  • 示例:

    hub.set_channel_power(1, 2, state=1)
    

获取通道电源状态

get_channel_power_status(*channels)

  • 描述: 查询指定通道的电源状态。

  • 参数:

    • *channels (int): 要查询的通道,可变参数形式,可用通道可通过 hub.get_channels() 获取。

  • 返回值:

    • dictintNone: 如果查询多个通道,返回包含通道状态的字典;如果查询单个通道,返回该通道的状态;若超时则返回 None

  • 示例:

    status = hub.get_channel_power_status(1, 2)
    

控制通道电源互锁

set_channel_power_interlock(channel)

  • 描述: 设置指定通道或所有通道的互锁模式。

  • 参数:

    • channel (intNone): 要设置的通道。如果为 None,则关闭所有通道。

  • 返回值:

    • bool: 如果命令设置成功返回 True,否则返回 False

  • 示例:

    hub.set_channel_power_interlock(1)
    

控制通道USB数据开关

set_channel_usb2_dataline(*channels, state)

  • 描述: 设置指定通道的USB数据开关状态。

  • 参数:

    • *channels (int): 要更新的通道,可变参数形式,可用通道可通过 hub.get_channels() 获取。

    • state (int): 1 连通 D+ D-的物理连接, 0 断开D+ D-的物理连接。

  • 返回值:

    • bool: 如果命令设置成功返回 True,否则返回 False

  • 示例:

    连通 通道1 的数据信号

    hub.set_channel_usb2_dataline(1,state=1)
    

获取通道USB数据开关状态

get_channel_usb2_dataline_status(*channels)

  • 描述: 查询指定通道的USB数据开关状态。

  • 参数:

    • *channels (int): 要查询的通道,可变参数形式,可用通道可通过 hub.get_channels() 获取。

  • 返回值:

    • dictNone: 包含通道状态的字典,若超时则返回 None

  • 示例:

    获取 通道2 的数据信号连接状态

    status = hub.get_channel_usb2_dataline_status(1, 2)
    

获取通道电压

注意: 此API仅适用于 带有电压、电流检测的 型号。

get_channel_voltage(channel)

  • 描述: 查询单个通道的电压。

  • 参数:

    • channel (int): 要查询的通道。

  • 返回值:

    • intNone: 通道的电压值(mV),若超时则返回 None

  • 示例:

    获取 通道1 的 电压值

    voltage = hub.get_channel_voltage(1)
    

获取通道电流

注意: 此API仅适用于 带有电压、电流检测的 型号。

get_channel_current(channel)

  • 描述: 查询单个通道的电流。

  • 参数:

    • channel (int): 要查询的通道。

  • 返回值:

    • intNone: 通道的电流值(mA),若超时则返回 None

  • 示例:

    获取 通道1 的 电流值

    current = hub.get_channel_current(1)
    

批量获取通道电压/电流

注意: 此 API 仅适用于 带有电压、电流检测的 型号。

get_channel_measurements(*channels)

  • 描述: 一次请求读取一个或多个通道的电压、电流测量值。未指定通道时,读取当前产品的所有有效通道。

  • 参数:

    • *channels (int): 要查询的通道,可变参数形式,可用通道可通过 hub.get_channels() 获取。

  • 返回值:

    • dictNone: 返回 {通道号: {"voltage": mV, "current": mA, "fresh": bool, "stale": bool, "valid": bool}},若超时或无有效数据则返回 None

  • 示例:

    measurements = hub.get_channel_measurements(1, 2)
    all_measurements = hub.get_channel_measurements(*hub.get_channels())
    

连续测量数据输出

注意: 此 API 仅适用于支持连续测量数据输出的型号。

set_channel_measurement_stream(*channels, enabled=True, wait_ack=True)

  • 描述: 开启或关闭指定通道的连续测量数据输出。未指定通道时,默认作用于当前产品的所有有效通道。

  • 参数:

    • *channels (int): 要输出测量数据的通道。

    • enabled (bool): True 开启,False 关闭。

    • wait_ack (bool): 是否等待设备应答。

  • 返回值:

    • bool: 成功返回 True,超时返回 False

  • 示例:

    hub.set_channel_measurement_stream(*hub.get_channels(), enabled=True)
    

get_stream_channel_measurements(*channels, timeout=None, wait_new_sample=True)

  • 描述: 等待下一帧连续测量数据并返回指定通道的测量值。调用前需要先开启连续测量数据输出。

  • 参数:

    • *channels (int): 要读取的通道。

    • timeout (float): 等待超时时间,单位为秒;不传则使用默认通信超时。

    • wait_new_sample (bool): True 时等待新的采样点,False 时接受下一帧数据。

  • 返回值:

    • dictNone: 返回包含 voltagecurrentsample_ticksample_period_ms 等字段的字典,超时返回 None

  • 示例:

    data = hub.get_stream_channel_measurements(1, 2, timeout=1.0)
    

get_latest_measurements(*channels)

  • 描述: 直接读取后台接收线程缓存的最新测量值,不阻塞等待新数据。通常与连续测量数据输出配合使用。

  • 参数:

    • *channels (int): 要读取的通道。

  • 返回值:

    • dictNone: 返回最新缓存测量值;如果还没有收到测量数据,则返回 None

  • 示例:

    latest = hub.get_latest_measurements(*hub.get_channels())
    

获取过流状态

注意: 此 API 仅适用于支持过流状态监控的型号,例如 SmartUSBHub Pro 7CH USB2.0 ADV。

get_channel_oc_status()

  • 描述: 查询每个通道的过流实时状态和锁存状态。

  • 返回值:

    • dictNone: 返回 {通道号: {"active": bool, "latch": bool}}active 表示当前过流状态,latch 表示锁存过流事件。若超时则返回 None

  • 示例:

    oc_status = hub.get_channel_oc_status()
    

clear_channel_oc_latch(*channels)

  • 描述: 清除指定通道的过流锁存状态。未指定通道时,清除所有通道的锁存状态。

  • 参数:

    • *channels (int): 要清除锁存状态的通道。

  • 返回值:

    • bool: 成功返回 True,超时返回 False

  • 示例:

    hub.clear_channel_oc_latch(1, 2)
    hub.clear_channel_oc_latch()
    

设置通道电源的上电默认状态

set_default_power_status(*channels,enable,status)

  • 描述: 设置指定通道的上电默认电源状态。

  • 参数:

    • *channels (int): 要设置的通道,可变参数形式,可用通道可通过 hub.get_channels() 获取。

    • enable (int): 1 启用默认状态, 0 禁用默认状态。

    • status (int): 1 默认打开电源,0 默认关闭电源

  • 示例:

    通道1、2、3、4上电默认打开

    hub.set_default_dataline_status(1,2,3,4,enable=1,status=0)
    

    通道1、2、3、4上电不使用默认值

    hub.set_default_dataline_status(1,2,3,4,enable=0)
    

获取通道电源的上电默认状态

get_default_power_status(self,*channels)

  • 描述: 查询一个或多个通道电源的默认上电状态

  • 参数:

    • *channels (int): 要查询的通道,可变参数形式,可用通道可通过 hub.get_channels() 获取。

  • 返回值:

    • dictNone: {通道号: {“enabled”: 是否启用, “value”: 状态}},其中 enabled 为 0(禁用)或 1(启用),value 为 0(默认关闭)或 1(默认开启)。

    • 若超时则返回 None

  • 示例:

    获取通道1、2、3、4的电源上电默认状态

    hub.get_default_power_status(1,2,3,4)
    

    返回:

    {1: {'enabled': 0, 'value': 0}, 2: {'enabled': 0, 'value': 0}, 3: {'enabled': 0, 'value': 0}, 4: {'enabled': 0, 'value': 0}}
    

设置通道数据连接的上电默认状态

set_default_dataline_status(*channels,enable,status)

  • 描述: 设置指定通道的上电默认数据连接状态。

  • 参数:

    • *channels (int): 要设置的通道,可变参数形式,可用通道可通过 hub.get_channels() 获取。

    • enable (int): 1 启用默认状态, 0 禁用默认状态。

    • status (int): 1 默认连接数据,0 默认断开数据

  • 返回值:

    • bool: 如果命令设置成功返回 True,否则返回 False

  • 示例:

    通道1、2、3、4上电默认数据连接

    hub.set_default_dataline_status(1,2,3,4,enable=1,status=1)
    

获取通道数据连接的上电默认状态

get_default_dataline_status(self,*channels)

  • 描述: 查询一个或多个通道的上电默认数据连接状态。

  • 参数:

    • *channels (int): 要查询的通道,可变参数形式,可用通道可通过 hub.get_channels() 获取。

  • 返回值:

    • dictNone: {通道号: {“enabled”: 是否启用, “value”: 状态}},其中 enabled 为 0(禁用)或 1(启用),value 为 0(默认断开)或 1(默认连接)。

    • 若超时则返回 None

  • 示例:

    获取通道1、2、3、4的数据连接的上电默认状态

    hub.get_default_dataline_status(1,2,3,4)
    

    返回:

    {1: {'enabled': 0, 'value': 1}, 2: {'enabled': 0, 'value': 1}, 3: {'enabled': 0, 'value': 1}, 4: {'enabled': 0, 'value': 1}}
    

设置断电状态记忆

set_auto_restore(enable)

  • 描述: 启用或禁用断电状态恢复。

  • 参数:

    • enable (bool): True 启用,False 禁用。

  • 返回值:

    • bool: 如果命令设置成功返回 True,否则返回 False

  • 示例:

    启用断电状态恢复

    hub.set_auto_restore(True)
    

设置断电状态记忆

get_auto_restore_status()

  • 描述: 查询是否启用断电状态恢复

  • 返回值:

    • int 或 None: 1 表示启用, 0 表示禁用, None 表示设备无响应.

  • 示例:

    启用断电状态恢复

    status = hub.get_auto_restore()
    

设置按钮控制

set_button_control(enable)

  • 描述: 启用或禁用集线器的物理按钮(如有)。

  • 参数:

    • enable (bool): True 启用按钮,False 禁用按钮。

  • 返回值:

    • bool: 如果命令设置成功返回 True,否则返回 False

  • 示例:

    设置按钮为启用

    hub.set_button_control(True)
    

获取按钮控制状态

get_button_control_status()

  • 描述: 查询集线器的物理按钮是否启用(如有)。

  • 返回值:

    • intNone: 1 表示启用,0 表示禁用,若无响应则返回 None

  • 示例:

    查询按钮是否启用

    status = hub.get_button_control_status()
    

设置设备地址

set_device_address(address)

  • 描述: 设备地址用于在多台集线器连接的场景中,标识和区分各个集线器。

  • 参数:

    • int :地址的编号由用户自定义,其取值范围为: 0x0000 - 0xFFFF

  • 返回值:

    • intNone: 1 表示启用,0 表示禁用,若无响应则返回 None

  • 提示

    • 创建SmartUSBHub实例时会自动获取连接设备的地址,不同SmartUSBHub实例可以通过地址区分。

  • 示例:

    设置设备地址为0x0001

    hub.set_device_address(0x0001)
    

获取设备地址

get_device_address()

  • 描述: 获取设备的地址。

  • 返回值:

    • intNone: 设备地址,若无响应则返回 None

  • 示例:

    查询设备地址

    device_address = hub.get_device_address()
    

设置设备的操作模式

set_operate_mode(mode)

  • 描述: 设置设备的操作模式。

  • 参数:

    • mode (int): 操作模式(0 为普通模式,1 为互锁模式)。

  • 返回值:

    • bool: 如果命令设置成功返回 True,否则返回 False

  • 注意:

    • 互锁模式下,控制只能用互锁指令。

  • 示例:

    设置设备为普通模式

    hub.set_operate_mode(0)
    

获取设备的操作模式

get_operate_mode()

  • 描述: 查询设备的当前操作模式。

  • 返回值:

    • intNone: 当前操作模式,若无响应则返回 None

  • 示例:

    查询设备操作模式

    mode = hub.get_operate_mode()
    

获取设备信息

get_device_info()

  • 描述: 获取集线器的 ID、硬件版本、固件版本、操作模式和按钮控制状态。

  • 返回值:

    • dict: 包含设备信息的字典。

  • 示例:

    info = hub.get_device_info()
    print(info)
    

获取产品类型

get_product_type()

  • 描述: 查询当前连接设备的产品类型 ID。

  • 返回值:

    • intNone: 产品类型 ID,若无响应则返回 None

  • 示例:

    product_type = hub.get_product_type()
    

获取产品名称

get_product_name()

  • 描述: 查询当前连接设备的产品名称,例如 HBP_USB2_4CHHBP_USB2_7CH_ADV

  • 返回值:

    • strNone: 产品名称,若无响应则返回 None

  • 示例:

    product_name = hub.get_product_name()
    

获取最大通道数

get_max_channels()

  • 描述: 查询当前设备的最大通道数量。新代码通常应优先使用 get_channels() 获取实际可用通道列表。

  • 返回值:

    • intNone: 最大通道数量;旧固件可能不支持该命令,此时返回 None

  • 示例:

    max_channels = hub.get_max_channels()
    channels = hub.get_channels()
    

获取设备序列号

get_serial_no()

  • 描述: 查询设备序列号。

  • 返回值:

    • strNone: 设备序列号;如果设备未提供序列号,可能返回 "N/A"

  • 示例:

    serial_no = hub.get_serial_no()
    

恢复出厂设置

factory_reset()

  • 描述: 将设备重置为出厂设置。

  • 返回值:

    • bool: 如果命令设置成功返回 True,否则返回 False

  • 示例:

    hub.factory_reset()
    

获取固件版本

get_firmware_version()

  • 描述: 查询设备的固件版本。

  • 返回值:

    • intNone: 固件版本,若无响应则返回 None

  • 示例:

    firmware_version = hub.get_firmware_version()
    

获取硬件版本

get_hardware_version()

  • 描述: 查询设备的硬件版本。

  • 返回值:

    • intNone: 硬件版本,若无响应则返回 None

  • 示例:

    hardware_version = hub.get_hardware_version()
    

注册用户回调

register_callback(cmd, callback)

  • 描述: 为指定的命令注册一个用户回调函数。当设备返回该命令的应答时,回调函数会被触发。

  • 参数:

    • cmd (int): 要注册回调的命令。

    • callback (function): 当命令的 ACK 被接收到时执行的回调函数。回调函数应接受两个参数:

      • channel (int): 触发回调的通道编号。

      • status (int): 通道的状态值。

  • 返回值:

    • 无返回值。

  • 注意事项:

    • 如果 cmd 不在支持的命令列表中,将记录警告日志,并不会注册回调。

    • 回调函数的签名应与设备返回的数据结构匹配。

    CMD宏

    含义

    CMD_GET_CHANNEL_POWER_STATUS

    获取通道电源开关值

    CMD_SET_CHANNEL_POWER

    控制通道电源

    CMD_SET_CHANNEL_POWER_INTERLOCK

    控制通道电源互锁

    CMD_SET_CHANNEL_DATALINE

    控制通道USB数据开关

    CMD_GET_CHANNEL_DATALINE_STATUS

    获取通道USB数据开关状态

    CMD_GET_CHANNEL_VOLTAGE

    获取通道电压

    CMD_GET_CHANNEL_CURRENT

    获取通道电流

    CMD_SET_BUTTON_CONTROL

    启用/禁用 按键控制

    CMD_GET_BUTTON_CONTROL_STATUS

    获取按键控制状态

    CMD_SET_DEFAULT_POWER_STATUS

    设置通道默认电源状态

    CMD_GET_DEFAULT_POWER_STATUS

    获取通道默认电源状态

    CMD_SET_DEFAULT_DATALINE_STATUS

    设置通道默认数据连接状态

    CMD_GET_DEFAULT_DATALINE_STATUS

    获取通道默认数据连接状态

    CMD_SET_AUTO_RESTORE

    启用/禁用 断电保存

    CMD_GET_AUTO_RESTORE_STATUS

    获取断电保存是否启用

    CMD_SET_DEVICE_ADDRESS

    设置设备的地址,用于在多台集线器连接的场景中,标识和区分各个集线器

    CMD_GET_DEVICE_ADDRESS

    获取设备的地址,用于在多台集线器连接的场景中,标识和区分各个集线器

    CMD_SET_OPERATE_MODE

    设置设备工作模式 普通/互锁

    CMD_GET_OPERATE_MODE

    获取设备工作模式

    CMD_FACTORY_RESET

    恢复出厂设置

    CMD_GET_FIRMWARE_VERSION

    获取固件版本号

    CMD_GET_HARDWARE_VERSION

    获取硬件版本号

  • 示例:

    设置按键回调,当按键按下时,产生回调

    def button_press_callback(channel, status):
        print("Button press detected on channel", channel, "with power status", status)
    
    hub.register_callback(CMD_GET_CHANNEL_POWER_STATUS, button_press_callback)