4. 串口通信调试

任务目标

在工业IoT网关开发板上配置UART接口,实现与PC或传感器的双向数据收发。通过串口调试工具发送数据帧,网关接收后原样返回(回环测试),以此验证串口驱动、引脚配置和收发链路均正常。

环境与依赖

  • 硬件:IoT网关开发板(含至少1路可用的UART外设,如STM32MP1系列或全志T3系列)
  • 系统:Linux(Yocto/Debian镜像均可),具备串口设备节点 /dev/ttyS* 或 /dev/ttyUSB*
  • PC端工具:minicom、picocom 或 Python pyserial(任选其一)
  • 接线:USB转TTL模块连接网关UART_TX/RX/GND(交叉连接TX-RX,RX-TX)

实现方案

采用Linux系统自带串口驱动,通过Python脚本配置UART参数(波特率115200、8N1)并执行回环测试。该方案不依赖额外硬件抽象层,直接操作系统设备节点,适用于大多数工业网关Linux环境。

关键完整代码

#!/usr/bin/env python3
# uart_loopback_test.py
import serial
import time
import sys

def configure_uart(port, baudrate=115200, timeout=2):
    """打开并配置串口,返回串口对象"""
    try:
        ser = serial.Serial(
            port=port,
            baudrate=baudrate,
            bytesize=serial.EIGHTBITS,
            parity=serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE,
            timeout=timeout
        )
        return ser
    except serial.SerialException as e:
        print(f"[ERROR] 无法打开串口 {port}: {e}")
        sys.exit(1)

def loopback_test(ser, test_data=b"UART-TEST-2024\r\n"):
    """发送测试数据并接收回显,验证收发链路"""
    ser.reset_input_buffer()
    ser.reset_output_buffer()
    
    # 发送数据
    written = ser.write(test_data)
    print(f"[TX] 发送 {written} 字节: {test_data.decode('ascii', errors='replace').strip()}")
    
    # 等待并接收回显
    time.sleep(0.2)
    received = ser.read(len(test_data))
    
    if received == test_data:
        print(f"[RX] 收到 {len(received)} 字节,数据一致")
        print("[PASS] 串口回环测试通过")
        return True
    else:
        print(f"[RX] 收到 {len(received)} 字节: {received}")
        print("[FAIL] 数据不一致,请检查接线或配置")
        return False

if __name__ == "__main__":
    # 默认端口,可通过命令行参数覆盖
    port = sys.argv[1] if len(sys.argv) > 1 else "/dev/ttyS1"
    
    ser = configure_uart(port)
    print(f"串口 {port} 已配置: 115200, 8N1")
    
    success = loopback_test(ser)
    ser.close()
    sys.exit(0 if success else 1)

运行与验证

  1. 将脚本复制到网关:scp uart_loopback_test.py root@<网关IP>:/root/
  2. 在网关执行:python3 uart_loopback_test.py /dev/ttyS1(根据实际设备节点调整端口)
  3. 观察输出:若显示 [PASS],说明UART发送与接收链路均正常。

PC端交叉验证(可选):将网关UART连接PC串口,PC端运行 picocom -b 115200 /dev/ttyUSB0,在PC端输入任意字符,网关侧运行 cat /dev/ttyS1 应能看到相同字符;反之在网关执行 echo "hello" > /dev/ttyS1,PC端应收到该字符串。

判定标准

  • 脚本输出 [PASS] 且退出码为0,表示回环测试通过。
  • 若输出 [FAIL],依次排查:波特率是否匹配、TX/RX是否交叉连接、设备节点是否存在(ls /dev/ttyS*)、串口是否被占用(fuser /dev/ttyS1)。

常见问题

  • 权限不足:Permission denied 时,将用户加入 dialout 组或使用 sudo 执行。
  • 无设备节点:确认内核已启用对应UART驱动,可在 /sys/class/tty/ 下查看可用串口。
  • 数据乱码:检查波特率、数据位、停止位是否与对端设备完全一致。