不止是终端复用:用Screen命令在Ubuntu上高效管理多个Arduino/树莓派串口会话
当你在Ubuntu工作站上同时调试三块Arduino开发板、两台树莓派和若干工控设备时,传统的串口终端工具往往会让你陷入不断切换窗口的混乱。这时,一个被严重低估的神器正静静躺在你的系统里——screen命令。大多数人只知道它是终端复用工具,却不知道它在多串口会话管理领域有着惊人的潜力。
1. 为什么Screen是串口调试的隐藏王牌?
在嵌入式开发领域,我们常遇到这样的场景:需要同时监控多个设备的日志输出、并行烧录固件、实时调试不同波特率的设备。传统方案要么像Minicom那样只能单窗口操作,要么像CuteCom那样占用大量图形资源。而screen以纯命令行方式实现了:
- 真正的并行会话:每个串口独立会话,可随时切换
- 零资源占用:后台运行不消耗额外GUI资源
- 会话持久化:SSH断开后仍保持连接
- 自动化友好:完美适配CI/CD流水线
最令人惊喜的是,screen处理不稳定串口连接的能力远超专用工具。当USB转串口适配器意外断开时,它能自动维持会话状态,重插设备后只需reattach即可恢复工作——这个特性在长时间烧录固件时堪称救命稻草。
2. 从设备识别到会话建立的完整工作流
2.1 精准识别多串口设备
连接多个设备后,首先需要明确每个物理设备对应的/dev节点。推荐组合使用以下命令:
# 查看当前所有串口设备 ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null # 获取设备详细信息 for dev in $(ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null); do echo -n "$dev: " udevadm info -a -n $dev | grep '{serial}' | head -n1 done典型输出示例:
/dev/ttyUSB0: ATTRS{serial}=="A50285BI" /dev/ttyUSB1: ATTRS{serial}=="FTDIF7V1KJ" /dev/ttyACM0: ATTRS{serial}=="752303138333518011C0"提示:将输出结果与设备物理标签对应记录,建议创建映射表:
设备位置 序列号后四位 设备节点 左侧蓝色Arduino 85BI /dev/ttyUSB0 工控机A F7V1 /dev/ttyUSB1 树莓派3B+ 011C /dev/ttyACM0
2.2 智能启动串口会话
常规的screen /dev/ttyUSB0 115200用法存在两个痛点:
- 每次需要手动输入波特率
- 无法自动识别特殊配置(如硬件流控)
改进方案是创建智能启动脚本serial_connect.sh:
#!/bin/bash DEVICE=$1 case $DEVICE in "/dev/ttyUSB0") # Arduino Mega screen $DEVICE 115200 -fn -ixon -ixoff ;; "/dev/ttyUSB1") # 工控PLC screen $DEVICE 9600 cs8 -parenb -cstopb -crtscts ;; "/dev/ttyACM0") # 树莓派 screen $DEVICE 115200 -echo -onlcr ;; *) echo "Unknown device: $DEVICE" exit 1 ;; esac赋予执行权限后,即可通过./serial_connect.sh /dev/ttyUSB0启动优化配置的会话。
3. 高阶会话管理技巧
3.1 分屏监控多个串口
同时查看多个设备输出的终极方案:
首先为每个串口创建独立会话:
screen -S arduino -d -m /dev/ttyUSB0 115200 screen -S plc -d -m /dev/ttyUSB1 9600创建控制台会话并分割窗口:
screen -S monitor在screen会话中:
Ctrl+a | # 垂直分割 Ctrl+a Tab # 切换区域 Ctrl+a c # 在新区域创建窗口在每个区域分别连接不同会话:
screen -x arduino # 左侧窗口 screen -x plc # 右侧窗口
3.2 自动化日志记录
对于需要长期运行的设备监控,结合script命令实现带时间戳的日志:
screen -L -Logfile /var/log/arduino_$(date +%Y%m%d).log \ -S arduino_log \ /dev/ttyUSB0 115200关键参数说明:
-L开启日志功能-Logfile指定日志路径- 日志会自动包含screen的控制字符,建议后续处理:
cat /var/log/arduino_20240520.log | col -b > clean.log
4. 实战问题排查指南
4.1 设备热插拔处理流程
当USB设备意外断开时:
- 首先确认物理连接状态
- 查看当前会话是否已detached:
screen -ls - 重新连接设备后,检查设备节点是否变化:
ls /dev/ttyUSB* - 若设备节点变化(如从ttyUSB0变为ttyUSB1),需要修改会话配置:
screen -S old_session -X stuff "newline" screen -S old_session -X zombie kr - 最后重新attach会话:
screen -r old_session
4.2 常见错误代码处理
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无法打开设备 | 权限不足 | sudo usermod -aG dialout $USER |
| 输入乱码 | 波特率不匹配 | 检查设备固件配置 |
| 无响应 | 流控设置错误 | 尝试添加-crtscts参数 |
| 会话卡死 | 控制字符冲突 | 启动时添加-fn -ixon参数 |
5. 超越基础:打造个性化工作环境
5.1 自定义.screenrc配置
在~/.screenrc中添加以下内容可极大提升体验:
# 启用状态栏 hardstatus alwayslastline hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]' # 优化滚动缓冲区 defscrollback 10000 # 自定义快捷键绑定 bind ^g stuff ^G # 允许发送Ctrl+G到串口设备 bind ^] quit # 用Ctrl+]替代默认退出组合5.2 集成到开发工作流
在PlatformIO或Arduino CLI中集成screen操作:
#!/bin/bash # flash_and_monitor.sh pio run -t upload && \ screen -dmS device_monitor /dev/ttyUSB0 115200 && \ screen -r device_monitor将此脚本设置为VSCode的"Upload and Monitor"任务,实现一键烧录+监控。