用screen监控嵌入式设备输出:从踩坑到精通的实战指南
你有没有遇到过这样的场景?
深夜调试一块新板子,U-Boot 正在打印启动日志,眼看着要进内核了——突然 SSH 断了。再连上去,串口工具一开,啥也没了。关键的那一行“why not boot from SD?”永远错过了。
又或者,你在跑一个7×24小时的压力测试,想第二天看有没有崩溃记录,结果发现本地终端关机后,日志全丢了。
这些问题的本质,不是硬件不稳,也不是代码有 bug,而是你的调试工具链太脆弱。
今天我们就来聊聊一个看似“老古董”,实则嵌入式工程师私藏利器的命令行工具:screen。它不仅能让你不再错过任何一行串口输出,还能把调试过程变得像搭积木一样灵活可靠。
为什么是screen?别再用 Putty 了!
先说结论:如果你还在用图形化串口工具(比如 Putty、Xshell 的串口模式、minicom -C),那你可能已经给自己埋下了三个雷:
- 网络一断,连接就崩
- 本地机器休眠,监控中断
- 无法脚本化,没法自动化
而screen,恰恰是为了解决这些痛点而生的。
它是 Linux 下经典的终端多路复用器,简单理解就是:你可以在一个终端里开多个“虚拟终端”,而且它们能在你断开后继续运行,随时回来接着看。
这听起来像是给 SSH 做会话保持?没错。但它干的可不止这个事。
在嵌入式开发中,screen最强大的用途之一,就是作为串口监控 + 日志捕获 + 后台守护三位一体的轻量级解决方案。
screen怎么监控串口?三步上手
第一步:找到你的串口设备
当你把 USB 转 TTL 模块插到电脑上时,系统会给它分配一个设备节点,通常是/dev/ttyUSB0或/dev/ttyACM0。
怎么确认?
dmesg | grep -E 'ttyUSB|ttyACM'输出类似这样:
[ 1234.567890] usb 1-2: FTDI USB Serial Device converter now attached to ttyUSB0看到没?设备已经挂载为/dev/ttyUSB0。
⚠️ 小贴士:如果提示权限不足,记得把你加入
dialout组:
bash sudo usermod -aG dialout $USER重新登录生效。
第二步:启动screen开始监听
现在,启动监控:
screen /dev/ttyUSB0 115200就这么简单?对。
这条命令的意思是:
- 打开设备
/dev/ttyUSB0 - 波特率设为 115200(常见于 U-Boot、Linux 内核打印)
- 进入交互界面,实时显示所有收到的数据
此时你会看到终端清屏,进入screen模式。只要目标板子有串口输出(比如上电重启),你就能立刻看到。
第三步:后台运行 & 随时回来
这才是screen的精髓所在。
你想去喝杯咖啡,或者暂时关闭终端?没问题。
按下组合键:
Ctrl + A,然后按 D你会发现终端跳了出来,回到 shell 提示符,并显示:
[detached from 1234.ttyUSB0]这意味着:串口监听仍在后台运行!数据一点没丢!
你可以随时回来查看:
screen -r如果有多个会话,可以用:
screen -ls列出当前所有会话:
There is a screen on: 1234.ttyUSB0 (Detached) 1 Socket in /var/run/screen/S-user.然后指定恢复:
screen -r 1234甚至支持命名会话,方便管理:
screen -S debug_imx6ull -L /dev/ttyUSB0 115200-S debug_imx6ull:给会话起个名字-L:开启日志记录,自动保存为screenlog.0
下次直接:
screen -r debug_imx6ull就能精准找回。
实战技巧:让调试更高效
技巧一:自动记录每一行输出
加个-L参数,screen会把所有串口内容原封不动写进文件。
这对于分析偶发性问题特别有用。比如某天早上发现设备昨晚崩了,但没人盯着终端——只要你用了-L,日志就在那儿。
默认生成screenlog.0,建议配合命名使用:
screen -S uart_log -L /dev/ttyUSB0 115200所有内容都会存到当前目录下的screenlog.0中,可以用tail -f screenlog.0实时查看,也可以事后用grep搜关键词:
grep -i "error\|panic\|segfault" screenlog.0技巧二:防止多人抢串口,谁也连不上
团队协作时常见问题:A 正在看串口,B 插了一句minicom,结果两个都卡住,报错:
Device or resource busy因为串口设备同一时间只能被一个进程打开。
解决办法?
统一使用screen,并且只开一个会话,大家轮流attach/detach。
流程如下:
- A 启动命名会话:
screen -S shared_debug /dev/ttyUSB0 115200 - A 看完后 detach:
Ctrl+A → D - B 恢复:
screen -r shared_debug - B 看完再 detach,通知下一个人
这样既避免冲突,又能保证监控不断。
技巧三:远程服务器上稳定抓日志
你在 IDC 机房有一台调试主机,上面接了几块开发板。你想在家里连过去看串口?
完全可行。
通过 SSH 登录那台主机,运行:
screen -S board_boot -L /dev/ttyUSB1 460800然后 detach。无论你在家、在公司、还是手机热点连一下,都能随时screen -r board_boot回来看最新输出。
即使网络波动导致 SSH 断开,screen里的串口连接依然健在,数据不会丢。
这才是真正的“无人值守监控”。
常见坑点与避坑秘籍
❌ 坑一:波特率不对,全是乱码
现象:屏幕上一堆“烫烫烫烫”或“ ”
原因:screen设置的波特率和设备发出的不一致。
解法:确认设备端配置。常见的有:
- 115200:绝大多数 ARM 板子默认
- 9600:一些旧设备或 bootloader 初始状态
- 460800 / 921600:高速调试场景(如 Android fastboot)
试试这个命令快速排查:
for rate in 9600 115200 460800 921600; do echo "Trying $rate..." screen /dev/ttyUSB0 $rate done当然,别真这么跑(会卡住),只是说明思路:必须匹配波特率。
❌ 坑二:设备被占用了!
报错:
Device or resource busy说明已经有程序在用/dev/ttyUSB0了。
查是谁占的:
lsof /dev/ttyUSB0输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME minicom 12345 user 3u CHR 188,0 0t0 6456 /dev/ttyUSB0杀掉它:
kill 12345或者更狠一点:
pkill minicom❌ 坑三:日志文件越来越大怎么办?
开了-L之后,screenlog.0会一直追加,几天下来可能几十MB甚至上百MB。
建议做法:
- 每次测试前手动清空或重命名日志
- 或者写个小脚本做轮转:
#!/bin/bash LOGDIR="./logs" mkdir -p $LOGDIR LOGFILE="$LOGDIR/screen_$(date +%Y%m%d_%H%M%S).log" # 启动带日志的新会话 screen -L -Logfile $LOGFILE -S auto_log /dev/ttyUSB0 115200每次运行生成新日志文件,便于归档。
和其他工具比,screen强在哪?
| 功能 | screen | minicom | putty | picocom |
|---|---|---|---|---|
| 支持后台运行 | ✅ | ❌ | ❌ | ❌ |
| 可恢复会话 | ✅ | ❌ | ❌ | ❌ |
| 内建日志记录 | ✅ | ✅ | ✅ | ❌ |
| 无需 GUI | ✅ | ✅ | ❌ | ✅ |
| 易于脚本集成 | ✅ | ⚠️(复杂) | ❌ | ✅ |
| 多窗口管理 | ✅ | ❌ | ❌ | ❌ |
可以看到,screen在灵活性、稳定性、自动化能力上全面胜出。
虽然picocom更简洁,适合一次性查看;但一旦涉及长期监控、远程维护、团队共享,screen就是无可替代的选择。
高阶玩法:把screen接入自动化体系
你以为它只是个手动调试工具?错了。
结合 shell 脚本,screen完全可以成为 CI/CD 流水线中的一环。
举个例子:自动检测启动是否成功。
#!/bin/bash SESSION="auto_test" LOGFILE="/tmp/boot_log.txt" # 启动后台监控 screen -dmS $SESSION -L -Logfile $LOGFILE /dev/ttyUSB0 115200 # 等待10秒(模拟设备上电) sleep 10 # 检查日志中是否有“Login prompt” if grep -q "login:" $LOGFILE; then echo "✅ 设备成功启动" exit 0 else echo "❌ 启动失败,未找到登录提示" exit 1 fi # 结束会话 screen -S $SESSION -X quit这个脚本可以在 Jenkins 或 GitLab CI 中运行,实现自动化的硬件启动验证。
是不是 suddenly 很工业风了?
最后一句真心话
screen不是什么炫酷的新技术,它早在上世纪八十年代就有了。
但它就像一把老扳手,不出众,不张扬,但在关键时刻,总能帮你拧紧最后一颗螺丝。
在嵌入式世界里,我们面对的是物理设备、是电平信号、是不可预测的断电重启。比起花哨的图形界面,我们需要的是稳定、可靠、抗折腾的工具链。
而screen,正是这样一个低调却不可或缺的存在。
下次当你准备打开 Putty 的时候,不妨试试:
screen /dev/ttyUSB0 115200也许你会发现,原来调试也可以这么安心。
如果你在实际使用中遇到奇怪的问题,欢迎留言交流。我们一起把这块“数字黑盒”的窗户擦得更亮一点。