You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash脚本中监控串口输出并检测设备启动完成

解决串口监控脚本中grep匹配后不退出的问题

问题场景

我需要编写Bash脚本监控嵌入式设备的串口输出,通过检测root@ramfs:~#提示符判断设备是否完全启动。经过调整stty参数解决了回显和缓冲问题后,当前脚本能正常看到目标提示符,但grep匹配后不会退出,导致整个脚本无法终止。

当前使用的脚本:

#!/bin/bash
stty -F /dev/ttyUSB0 115200 -echo -icrnl raw
cat /dev/ttyUSB0 | tee /dev/tty | grep --max-count=1 -F "root@ramfs:"

问题原因

  1. raw模式的缓冲影响:当串口设置为raw模式时,输出不会自动按行分割,grep默认的行缓冲机制可能因为未收到换行符,即使匹配到目标字符串也不会触发退出逻辑。
  2. 匹配字符串不完整:原脚本只匹配root@ramfs:,而实际提示符是root@ramfs:~#,可能存在部分匹配后后续字符持续输入,导致grep未触发--max-count=1的退出条件。

解决方案

方案1:强制grep行缓冲并匹配完整提示符

给grep添加--line-buffered参数强制行缓冲,同时匹配完整的提示符字符串:

#!/bin/bash
stty -F /dev/ttyUSB0 115200 -echo -icrnl raw
cat /dev/ttyUSB0 | tee /dev/tty | grep --line-buffered --max-count=1 -F "root@ramfs:~#"

方案2:用awk替代grep,更灵活控制退出逻辑

awk可以在匹配到目标后立即退出,同时自动终止上游的cat进程,避免管道残留进程:

#!/bin/bash
stty -F /dev/ttyUSB0 115200 -echo -icrnl raw
cat /dev/ttyUSB0 | tee /dev/tty | awk '/root@ramfs:~#/ {print; exit}'

解释:awk匹配到目标字符串后,会打印内容并立即退出,管道的上游进程(cat)会因为管道关闭而自动终止,整个脚本随之结束。

方案3:添加超时兜底(可选)

为了避免设备启动异常时脚本无限等待,可以用timeout命令设置最大等待时长(示例为600秒即10分钟):

#!/bin/bash
stty -F /dev/ttyUSB0 115200 -echo -icrnl raw
timeout 600 cat /dev/ttyUSB0 | tee /dev/tty | awk '/root@ramfs:~#/ {print; exit}'

额外注意事项

  • 确保串口波特率、设备文件路径与嵌入式设备的配置完全一致
  • 如果匹配仍然失败,可通过cat /dev/ttyUSB0 | od -x查看串口输出的原始字符,检查是否包含颜色控制码等特殊字符,调整匹配字符串
  • 运行脚本需要足够权限,可通过sudo执行,或者将当前用户加入dialout组(sudo usermod -aG dialout $USER)

内容的提问来源于stack exchange,提问作者Douglas B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:43:02