2. 串口参数配置与连接测试

任务说明

本案例实现串口参数的配置(波特率、数据位、停止位、校验位)与连接测试。通过用户输入端口号和参数,程序尝试打开串口并返回连接状态,若失败则给出明确错误原因。

实现方案

使用 pyserial 库完成串口操作。核心逻辑分为三步:

  1. 定义参数配置函数,将用户输入映射为 serial.Serial 可识别的参数格式;
  2. 尝试打开串口并设置超时,若成功则立即关闭(仅测试连接);
  3. 捕获常见异常(端口不存在、被占用、参数错误等),输出对应的错误提示。

代码实现

import serial
import serial.tools.list_ports

def list_available_ports():
    """列出当前可用串口"""
    ports = serial.tools.list_ports.comports()
    return [port.device for port in ports]

def configure_and_test(port, baudrate, bytesize, parity, stopbits, timeout=1):
    """
    配置串口参数并测试连接
    返回: (成功标志, 消息)
    """
    # 参数映射
    bytesize_map = {
        5: serial.FIVEBITS,
        6: serial.SIXBITS,
        7: serial.SEVENBITS,
        8: serial.EIGHTBITS
    }
    parity_map = {
        'N': serial.PARITY_NONE,
        'E': serial.PARITY_EVEN,
        'O': serial.PARITY_ODD
    }
    stopbits_map = {
        1: serial.STOPBITS_ONE,
        1.5: serial.STOPBITS_ONE_POINT_FIVE,
        2: serial.STOPBITS_TWO
    }

    # 参数合法性检查
    if bytesize not in bytesize_map:
        return False, f"不支持的数据位: {bytesize},可选 5/6/7/8"
    if parity.upper() not in parity_map:
        return False, f"不支持的校验位: {parity},可选 N/E/O"
    if stopbits not in stopbits_map:
        return False, f"不支持的停止位: {stopbits},可选 1/1.5/2"

    try:
        ser = serial.Serial(
            port=port,
            baudrate=baudrate,
            bytesize=bytesize_map[bytesize],
            parity=parity_map[parity.upper()],
            stopbits=stopbits_map[stopbits],
            timeout=timeout
        )
        # 连接成功,立即关闭
        ser.close()
        return True, f"连接成功: {port} @ {baudrate}bps, {bytesize}{parity}{stopbits}"
    except serial.SerialException as e:
        return False, f"连接失败: {e}"

if __name__ == "__main__":
    # 显示可用端口
    ports = list_available_ports()
    if not ports:
        print("未检测到可用串口")
        exit(1)
    print("可用串口:", ", ".join(ports))

    # 用户输入参数
    port = input("请输入端口号 (如 COM3 或 /dev/ttyUSB0): ").strip()
    baudrate = int(input("请输入波特率 (如 9600/115200): ").strip())
    bytesize = int(input("请输入数据位 (5/6/7/8): ").strip())
    parity = input("请输入校验位 (N=无/E=偶/O=奇): ").strip().upper()
    stopbits = float(input("请输入停止位 (1/1.5/2): ").strip())

    # 执行连接测试
    success, msg = configure_and_test(port, baudrate, bytesize, parity, stopbits)
    print(msg)
    if success:
        print("测试通过")
    else:
        print("测试未通过")

运行与验证

依赖安装:

pip install pyserial

运行方式:

python serial_config_test.py

验证方法:

  1. 程序启动后列出当前系统识别的所有串口设备;
  2. 输入一个存在的端口号(如 COM3)和常用参数(115200, 8, N, 1);
  3. 预期输出:连接成功: COM3 @ 115200bps, 8N1 且显示“测试通过”;
  4. 输入一个不存在的端口(如 COM99),预期输出包含“连接失败”和具体错误原因;
  5. 输入非法参数(如数据位 9),预期输出提示“不支持的数据位: 9”。

判定标准:程序能正确区分“连接成功”与各类失败原因,且错误信息准确对应实际异常类型,即视为通过。

串口参数配置与连接测试流程 用户输入 端口号: COM3 波特率: 115200 数据位: 8 校验位: N 停止位: 1 (通过 input() 获取) 参数映射与校验 bytesize_map[8] → EIGHTBITS parity_map['N'] → PARITY_NONE stopbits_map[1] → STOPBITS_ONE 非法参数 → 返回错误信息 合法参数 → 继续执行 串口连接测试 serial.Serial(port, baudrate, ...) 打开成功 → 立即 close() SerialException 捕获 返回具体错误原因 输出: 成功/失败 + 详细信息