如何让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
相关产品推荐
相关产品推荐

