1. 串口端口自动枚举与选择

串口端口自动枚举与选择 学习卡片

任务说明

在串口设备自动化开发中,第一步往往是确定目标设备连接在哪个端口上。本案例要求编写一个Python程序,自动枚举当前系统中所有可用的串口端口,并以列表形式展示给用户,由用户输入序号选择目标端口。程序需处理无可用串口、无效输入等边界情况,最终输出用户选定的端口名称,为后续串口通信操作做好准备。

实现方案

使用Python标准库中的serial.tools.list_ports模块完成端口枚举,该模块跨平台支持Windows、Linux和macOS。程序流程为:调用list_ports.comports()获取端口列表,若列表为空则提示并退出;否则逐条显示端口序号、设备名称和描述信息,接收用户输入序号并校验范围,最后返回所选端口对象。核心逻辑封装在select_port()函数中,便于后续案例直接复用。

代码实现

import serial.tools.list_ports

def select_port():
    """枚举所有可用串口,让用户选择并返回所选端口对象。"""
    ports = list(serial.tools.list_ports.comports())
    
    if not ports:
        print("未检测到任何可用串口,请检查设备连接。")
        return None
    
    print("检测到以下可用串口:")
    for idx, port in enumerate(ports):
        desc = port.description if port.description else "未知设备"
        print(f"[{idx}] {port.device} - {desc}")
    
    while True:
        try:
            choice = input("请输入要选择的端口序号: ")
            choice = int(choice)
            if 0 <= choice < len(ports):
                selected = ports[choice]
                print(f"已选择端口: {selected.device}")
                return selected
            else:
                print(f"序号超出范围,请输入 0~{len(ports)-1} 之间的数字。")
        except ValueError:
            print("输入无效,请输入整数序号。")

if __name__ == "__main__":
    select_port()

运行与验证

依赖安装:本程序依赖pyserial库,执行以下命令安装:

pip install pyserial

运行方式:将代码保存为port_selector.py,在终端执行:

python port_selector.py

验证方法:

  1. 不连接任何串口设备时运行,程序应输出“未检测到任何可用串口”并正常退出。
  2. 连接一个USB转串口设备后再次运行,程序应列出该端口及其描述信息。
  3. 输入超出范围的序号(如99)或非数字字符(如abc),程序应提示错误并要求重新输入。
  4. 输入有效序号(如0),程序应输出“已选择端口: COM3”(实际名称以系统显示为准),并返回端口对象。

判定标准:程序能正确枚举当前系统真实存在的串口,用户输入合法序号后返回对应端口对象,且对无端口、越界、非数字输入均能给出明确提示并正确处理,即视为通过。

串口端口自动枚举与选择 — 程序流程 list_ports.comports() 端口列表为空? 提示无端口并退出 显示序号+端口+描述 input() 接收用户输入 校验序号 提示错误,重新输入 返回所选端口对象 图例 系统调用 条件判断 正常流程 异常/退出