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)
运行与验证
- 将脚本复制到网关:
scp uart_loopback_test.py root@<网关IP>:/root/ - 在网关执行:
python3 uart_loopback_test.py /dev/ttyS1(根据实际设备节点调整端口) - 观察输出:若显示
[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/下查看可用串口。 - 数据乱码:检查波特率、数据位、停止位是否与对端设备完全一致。