shell脚本通过解析日志使用串口开关屏知识点整理

2024-06-21 17:36

本文主要是介绍shell脚本通过解析日志使用串口开关屏知识点整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#!/bin/bash  
#logPath 写日志的存放路径
#logPath=/home/workspace/tvs/trainborne
logPath=/home/firefly
tmpFile=$$
function getLogName()
{
#echo "$logPath/LCDController_"`date +"%Y%m%d000000.log"`
echo "LCDController_20240424000000.log"
}
# 串口设备文件  
SERIAL_PORT="/dev/ttyS0"  # 设置串口参数  
stty -F $SERIAL_PORT 9600 cs8 -cstopb -parenb  # 要发送的16进制数据,这里以 "48 65 6c 6c 6f"(即 "Hello" 的ASCII码)为例  
OPEN_HEX_DATA="aa aa 80 01 00 00 00 03 00 00 00 08 ff ff 06 01 00 18 02 1d db d3 07 58"  
CLOSE_HEX_DATA="aa aa 80 01 00 00 00 03 00 00 00 08 ff ff 06 01 00 18 01 1E 69 f7 05 21"  # 使用printf发送16进制数据,注意前面加上了'\x'来指定是16进制  
# 这里使用了一个循环来遍历HEX_DATA中的每个值  
closeScreen()
{
#	echo `date +"%Y-%m-%d %H:%M:%S"`" closeScreen" >>tmp.log
echo `date +"%Y-%m-%d %H:%M:%S"`" closeScreen"
OLD_IFS=$IFS  
IFS=' ' # 设置内部字段分隔符为空格  
read -ra ADDR <<< "$CLOSE_HEX_DATA" # 将HEX_DATA分割为一个数组  
IFS=$OLD_IFS # 恢复原始的内部字段分隔符  for byte in "${ADDR[@]}"; do  printf "\\x$byte" > $SERIAL_PORT  
done
}
openScreen()
{echo `date +"%Y-%m-%d %H:%M:%S"`" openScreen" >>tmp.logecho `date +"%Y-%m-%d %H:%M:%S"`" openScreen"
OLD_IFS=$IFS  
IFS=' ' # 设置内部字段分隔符为空格  
read -ra ADDR <<< "$OPEN_HEX_DATA" # 将HEX_DATA分割为一个数组  
IFS=$OLD_IFS # 恢复原始的内部字段分隔符  for byte in "${ADDR[@]}"; do  printf "\\x$byte" > $SERIAL_PORT  
done
}
function Test()
{
closeScreen
sleep 2
openScreen
exit 0
}
echo "执行$0 test 可以测试串口开关屏"
if [ "$1" == "test" ]; thenecho "call test"Testexit 0
fi# 如果你知道发送的数据量并且想要一次发送所有字节(注意:这可能在某些shell中不起作用)  
# echo -ne '\x48\x65\x6c\x6c\x6f' > $SERIAL_PORT  
# 注意:上面的-ne选项在bash中是有效的,但在某些shell中可能不支持  # 读取并显示来自串口的响应(如果需要的话)  
# cat $SERIAL_PORT
log=$(getLogName)
grep -rn "trun on" $log |awk '{print $1}'> $tmpFile
i=0
while read -r value;
do
strArray["$i"]="$value" 
i=$((i+1))
done < $tmpFile
rm $tmpFile
i=$((i-1))
if [ $i -ne "-1" ]; thentmp=${strArray[$i]}tmp=`echo $tmp|cut -d':' -f1`i=$((tmp+8))tmp=`sed -n "$i"p $log`tmpDate=`echo $tmp|cut -d'.' -f1`timeStampTmp=`date -d "$tmpDate" +%s`now=`date`timeStampNow=`date -d "$now" +%s`diff=$((timeStampNow-timeStampTmp))if [ $diff -lt 60 ]; thenecho `date +"%Y-%m-%d %H:%M:%S"`" grep string $tmp" >tmp.logecho `date +"%Y-%m-%d %H:%M:%S"`" grep string $tmp"tmp=`echo $tmp|cut -d':' -f6`if [ $tmp == 31 ]; thenecho "open screen" >> tmp.logopenScreenelseecho "close screen" >> tmp.logcloseScreenfifi
fi
exit 0

函数返回字符串可以用echo 来实现

使用时log=$(getLogName),一定要用$()才可以,不然getLogName就会被当成字符串

但是这样调用函数时,函数内不能正常使用echo 打印调试内容。

shell 可以直接操作串口,使用stty 设置串口参数

echo `date +"%Y-%m-%d %H:%M:%S"`" closeScreen"

日期格式输出date +"%Y-%m-%d %H:%M:%S
OLD_IFS=$IFS  
IFS=' ' # 设置内部字段分隔符为空格  
read -ra ADDR <<< "$CLOSE_HEX_DATA" # 将一串包含空格的数据分割为一个数组保存  
IFS=$OLD_IFS # 恢复原始的内部字段分隔符  
  
for byte in "${ADDR[@]}"; do  
    printf "\\x$byte" > $SERIAL_PORT  
done

使用printf发送16进制数据,注意前面加上了'\x'来指定是16进制,例要发16进制AB到串口,就要发字符串\xAB,\x又要用\\x来表示,所以是'\\xAB'

把awk的结果定到文件,再读取文件数据内容保存到数组中

while read -r value;
do
strArray["$i"]="$value" 
i=$((i+1))
done < $tmpFile

$(())可以用来直接进行数学运算,变量在里面直接用

访问数组元素tmp=${strArray[$i]}

单独显示文件特定行内容

tmp=`sed -n "$i"p $log`

把时间的字符串换算成跟1970年的时间的秒数,方便进行比较时间差

timeStampTmp=`date -d "$tmpDate" +%s`

这篇关于shell脚本通过解析日志使用串口开关屏知识点整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081875

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期