
Linux 串口自动化测试3 种 Shell 脚本方案对比与实战在嵌入式开发和工业自动化领域串口通信作为设备间最基础的交互方式之一其稳定性和可靠性直接影响着整个系统的运行质量。传统的手动测试方法不仅效率低下更难以满足产线批量测试和设备持续监控的需求。本文将深入剖析三种主流的Shell脚本自动化测试方案从基础命令组合到专业工具应用为工程师提供一套完整的自动化测试框架。1. 串口测试环境准备与基础验证在开始自动化测试前确保系统环境正确配置是成功的第一步。现代Linux系统通常将串口设备映射为/dev/ttyS*原生串口或/dev/ttyUSB*USB转串口设备文件。通过以下命令快速确认设备识别情况# 查看已识别的串口设备 ls /dev/tty* | grep -E ttyS|ttyUSB # 获取详细串口属性需root权限 sudo stty -F /dev/ttyUSB0 -a关键参数配置直接影响通信质量使用stty工具可快速设置波特率等基础参数# 设置波特率为1152008位数据位无校验位1位停止位 sudo stty -F /dev/ttyUSB0 115200 cs8 -parenb -cstopb注意实际测试中建议将用户加入dialout组以避免频繁使用sudosudo usermod -aG dialout $USER基础回环测试是验证串口通路的最快捷方式。通过短接TX与RX引脚或使用虚拟串口对运行以下测试脚本#!/bin/bash # serial_loopback_test.sh DEVICE/dev/ttyUSB0 TEST_STRINGLOOPBACK_TEST_$(date %s) # 后台启动数据接收监控 cat $DEVICE receive.log RECEIVE_PID$! # 发送测试数据 echo $TEST_STRING $DEVICE sleep 0.5 # 等待数据传输 # 验证接收数据 if grep -q $TEST_STRING receive.log; then echo [PASS] Loopback test successful else echo [FAIL] Data not matched fi kill $RECEIVE_PID rm receive.log该脚本实现了最基本的自发自收测试适合快速验证硬件连接。但实际生产环境中我们需要更强大的自动化方案。2. 原生Shell方案管道与重定向的高级应用利用Linux强大的管道机制可以构建无需额外工具的轻量级测试框架。以下脚本展示了如何实现定时数据发送与接收分析#!/bin/bash # serial_native_test.sh PORT${1:-/dev/ttyUSB0} BAUD${2:-115200} LOG_FILEserial_$(date %Y%m%d_%H%M%S).log # 配置串口参数 stty -F $PORT $BAUD cs8 -parenb -cstopb # 数据收发主循环 ( while true; do echo TEST_PATTERN_$(date %s) sleep 1 done ) $PORT # 后台记录接收数据 cat $PORT | tee $LOG_FILE MONITOR_PID$! # 运行10秒后停止测试 sleep 10 kill $MONITOR_PID jobs -p | xargs kill # 分析接收数据 echo -e \n Test Summary echo Total lines received: $(wc -l $LOG_FILE) echo Last 5 messages: tail -n 5 $LOG_FILE性能优化技巧使用dd命令替代cat可获得更高吞吐量添加-icanon参数禁用规范模式处理结合timeout命令防止阻塞对于需要复杂交互的场景可以使用文件描述符实现双向通信#!/bin/bash # serial_fd_test.sh exec 3/dev/ttyUSB0 # 打开读写文件描述符 # 发送命令并等待响应 send_command() { echo -e $1\r 3 while read -t 1 -u 3 response; do echo $response [[ $response *OK* ]] break done } send_command AT send_command ATI send_command ATCSQ exec 3- # 关闭描述符这种方案适合资源受限环境但缺乏对超时、异常情况的完善处理机制。3. Expect脚本方案智能交互测试框架Expect作为自动化交互工具的金标准能完美解决串口测试中的预期响应匹配问题。以下是一个完整的设备配置验证脚本#!/usr/bin/expect -f # serial_expect_test.exp set timeout 3 set port [lindex $argv 0] set baud [lindex $argv 1] spawn -noecho microcom -p $port -s $baud expect { timeout { send_user Connection timeout\n; exit 1 } login: { send admin\r } } expect Password: send password123\r expect # send show version\r expect { -re Version: (\\S) { set version $expect_out(1,string) send_user Current version: $version\n } timeout { send_user Version check failed\n } } send exit\r expect eof关键功能增强正则表达式匹配响应内容多分支异常处理测试结果结构化提取对于产线批量测试可扩展为参数化测试套件#!/usr/bin/expect -f # production_line_test.exp set devices { {/dev/ttyUSB0 115200} {/dev/ttyUSB1 9600} } foreach device $devices { set port [lindex $device 0] set baud [lindex $device 1] spawn -noecho ./device_test.exp $port $baud expect { TEST PASSED { log_file -a results.log send_user $port: PASS\n } timeout { send_user $port: FAIL (timeout)\n } } }4. 专业工具方案socat与虚拟串口技术socat作为网络/串口的多功能桥接工具可实现复杂的测试拓扑。以下示例创建虚拟串口对进行隔离测试# 创建虚拟串口对 socat -d -d pty,raw,echo0 pty,raw,echo0 # 输出示例 # 2023/01/01 10:00:00 socat[1234] N PTY is /dev/pts/3 # 2023/01/01 10:00:00 socat[1234] N PTY is /dev/pts/4 # 在终端1监听虚拟串口 cat /dev/pts/3 # 在终端2发送测试数据 echo TEST /dev/pts/4高级转发测试架构# 真实设备-虚拟串口-测试脚本 socat /dev/ttyUSB0,b115200,raw,echo0 \ SYSTEM:./serial_test.sh,pty,raw,echo0结合socat和Shell脚本可以实现自动化测试流水线#!/bin/bash # socat_test_pipeline.sh VIRTUAL_PORT$(mktemp -u /tmp/vport.XXXXXX) mkfifo $VIRTUAL_PORT # 启动socat转发 socat PTY,link$VIRTUAL_PORT,raw,echo0 \ /dev/ttyUSB0,b115200,raw,echo0 # 运行测试套件 ./run_tests.sh $VIRTUAL_PORT # 清理 kill $! rm $VIRTUAL_PORT5. 方案对比与选型指南特性原生Shell方案Expect方案Socat方案开发复杂度★★☆☆☆★★★☆☆★★★★☆交互能力单向通信双向智能交互双向原始通信异常处理需手动实现内置完善机制需额外开发性能高中高多设备支持需脚本扩展易扩展原生支持适用场景简单数据收发协议验证复杂拓扑测试选型建议快速验证原生Shell方案设备配置测试Expect方案压力/隔离测试Socat方案产线批量测试ExpectShell组合实际项目中我们常采用混合方案。例如使用Expect处理登录流程后切换至原生Shell进行大数据量传输测试。这种组合既能保证可靠性又能获得最佳性能。