2. 串口参数配置

任务说明

本案例要求实现一个串口参数配置工具,能够设置波特率、数据位、停止位、校验位,并验证不同参数组合下两台设备(或回环测试)能否正常通信。核心目标是:通过代码修改串口参数后,实际发送数据并确认接收端收到的内容与发送端一致,以此判定参数配置是否生效且通信正常。

实现方案

使用Python的pyserial库完成串口参数配置与通信测试。采用回环测试方式:将串口的TX与RX短接(或使用USB转串口模块的自收发模式),在同一台计算机上打开两个串口实例——一个作为发送端,一个作为接收端,分别配置相同参数后互发数据验证。若硬件不支持回环,可将两个USB转串口模块交叉连接(TX接RX,RX接TX,GND共地)。

代码实现

import serial
import serial.tools.list_ports
import time

# 可用串口参数组合(波特率, 数据位, 停止位, 校验位)
PARAM_SETS = [
    (9600, 8, 1, 'N'),
    (19200, 8, 1, 'E'),
    (115200, 8, 2, 'N'),
    (57600, 7, 1, 'E'),
]

def list_serial_ports():
    """列出所有可用串口"""
    ports = serial.tools.list_ports.comports()
    return [p.device for p in ports]

def configure_serial(port, baudrate, bytesize, stopbits, parity):
    """创建并配置串口对象"""
    parity_map = {'N': serial.PARITY_NONE,
                  'E': serial.PARITY_EVEN,
                  'O': serial.PARITY_ODD}
    bytesize_map = {5: serial.FIVEBITS, 6: serial.SIXBITS,
                    7: serial.SEVENBITS, 8: serial.EIGHTBITS}
    stopbits_map = {1: serial.STOPBITS_ONE, 2: serial.STOPBITS_TWO}

    ser = serial.Serial()
    ser.port = port
    ser.baudrate = baudrate
    ser.bytesize = bytesize_map[bytesize]
    ser.parity = parity_map[parity]
    ser.stopbits = stopbits_map[stopbits]
    ser.timeout = 2
    return ser

def test_communication(tx_ser, rx_ser, test_data):
    """发送测试数据并验证接收内容"""
    tx_ser.reset_input_buffer()
    rx_ser.reset_input_buffer()
    tx_ser.write(test_data)
    time.sleep(0.1)  # 等待数据到达
    received = rx_ser.read(len(test_data))
    return received == test_data, received

def main():
    ports = list_serial_ports()
    if len(ports) < 2:
        print("错误:至少需要2个可用串口(或1个支持回环的串口)")
        print("当前可用串口:", ports)
        return

    # 使用前两个串口,或同一串口回环
    tx_port = ports[0]
    rx_port = ports[1] if len(ports) > 1 else ports[0]
    print(f"发送端: {tx_port}, 接收端: {rx_port}")

    test_message = b"UART-Param-Test-123"

    for baud, data_bits, stop_bits, parity in PARAM_SETS:
        print(f"\n测试参数: 波特率={baud}, 数据位={data_bits}, "
              f"停止位={stop_bits}, 校验位={parity}")

        tx_ser = None
        rx_ser = None
        try:
            tx_ser = configure_serial(tx_port, baud, data_bits,
                                      stop_bits, parity)
            rx_ser = configure_serial(rx_port, baud, data_bits,
                                      stop_bits, parity)
            tx_ser.open()
            rx_ser.open()

            if not (tx_ser.is_open and rx_ser.is_open):
                print("  [失败] 串口打开失败")
                continue

            success, received = test_communication(tx_ser, rx_ser, test_message)
            if success:
                print(f"  [通过] 发送 {len(test_message)} 字节,接收内容一致")
            else:
                print(f"  [失败] 发送: {test_message}")
                print(f"         接收: {received}")

        except serial.SerialException as e:
            print(f"  [异常] {e}")
        finally:
            if tx_ser and tx_ser.is_open:
                tx_ser.close()
            if rx_ser and rx_ser.is_open:
                rx_ser.close()

if __name__ == "__main__":
    main()

运行与验证

依赖安装:

pip install pyserial

硬件准备:将USB转串口模块的TX与RX短接(回环模式),或使用两个模块交叉连接。将模块插入计算机USB口,确认系统识别出串口设备。

运行程序:

python uart_param_config.py

判定标准:程序依次测试4组参数组合,每组输出[通过]表示该参数配置下通信正常,发送与接收数据完全一致;输出[失败]或[异常]则说明该参数配置存在问题。全部4组均通过,即可确认串口参数配置功能正确且不同参数下通信均正常。

串口参数配置测试拓扑与验证流程 发送端 TX: 引脚1 GND: 引脚5 接收端 RX: 引脚2 GND: 引脚5 TX → RX 交叉连接 GND 共地 参数配置(4组测试) 波特率 数据位 停止位 校验位 验证结果 9600 8 1 N ✓ 通过 验证流程 发送端写入测试数据 → 等待100ms → 接收端读取相同长度字节 → 比对内容是否一致 判定标准:接收数据 == 发送数据(逐字节完全匹配)

关键说明

  • 程序自动检测可用串口,优先使用前两个;若只有一个串口,则自动使用同一串口进行回环测试(需硬件支持自收发)。
  • 每组参数测试前会清空收发缓冲区,避免残留数据干扰判定。
  • 校验位为E(偶校验)时,若数据位设为8,部分硬件可能不支持,此时可改用7位数据位(代码中已包含该组合)。
  • 若某组参数打开串口失败,程序会捕获异常并继续测试下一组,不会中断整个流程。