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

如何让read命令返回输入接收耗时?串口监控脚本问题排查

串口监控脚本的超时差值与读取耗时统计方案

核心实现思路

通过纳秒级时间戳记录read命令执行前后的时间点,计算时间差来获取精确的读取耗时或超时差值,无需反复测试调整超时参数。

完整脚本示例

#!/bin/bash
SERIAL_PORT="/dev/ttyS0"
TIMEOUT=2

# 获取当前纳秒级时间戳(格式:秒.纳秒)
get_timestamp() {
    printf '%(%s.%N)T\n' -1
}

# 计算时间差(结束时间 - 开始时间)
calc_time_diff() {
    local start=$1
    local end=$2
    awk -v s="$start" -v e="$end" 'BEGIN{printf "%.6f\n", e - s}'
}

# 执行读取并统计时间
start_time=$(get_timestamp)
if read -t $TIMEOUT line < "$SERIAL_PORT"; then
    # 读取成功,计算耗时
    end_time=$(get_timestamp)
    elapsed=$(calc_time_diff "$start_time" "$end_time")
    echo "读取成功,耗时:${elapsed}秒,内容:$line"
    # 这里放原有的成功处理逻辑
else
    # 读取超时,计算实际超时差值
    end_time=$(get_timestamp)
    actual_timeout=$(calc_time_diff "$start_time" "$end_time")
    timeout_diff=$(awk -v t="$TIMEOUT" -v a="$actual_timeout" 'BEGIN{printf "%.6f\n", a - t}')
    echo "读取超时,设定超时${TIMEOUT}秒,实际耗时${actual_timeout}秒,差值:${timeout_diff}秒"
    # 这里放原有的超时触发动作
fi

关键说明

  • get_timestamp函数:利用bash内置的printf输出纳秒级时间戳,精度足够满足串口通信的时间统计需求
  • calc_time_diff函数:通过awk计算时间差,保留6位小数,确保结果精确
  • 区分成功/超时分支:分别统计对应场景的时间数据,方便分析串口回复的稳定性,判断是否需要调整超时阈值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:33:14