当前位置: 首页 > news >正文

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`

http://www.lryc.cn/news/380839.html

相关文章:

  • 速盾:视频cdn和网站cdn的相同点与不同点
  • 37.自定义协议
  • 【React Native】measureInWindow在安卓上无法正确获取View在屏幕上的布局信息
  • C++ 教程 - 04 类的使用
  • excel按模板文件导出多个文件并压缩为ZIP格式返回前端
  • 自动驾驶仿真测试用例表格示例 ACC ELK FCW
  • 数组 (java)
  • 时序预测 | Matlab基于Transformer多变量时间序列多步预测
  • suuk-s.php.jpg-python 库劫持
  • python3GUI--ktv点歌软件By:PyQt5(附下载地址)
  • opencascade AIS_InteractiveContext源码学习2
  • scale()函数详解
  • 计算机基础学习有多重要?学哪些?如何学?
  • Oracle day9
  • Race Condition竞争条件
  • docker 删除本地镜像释放磁盘空间
  • JVM中的垃圾回收器
  • 记录一些可用的AI工具网站
  • vue3页面传参
  • QNX OS微内核系统
  • ViT:5 Knowledge Distillation
  • 2024头歌数据库期末综合(部分题)
  • 【Flask】学习
  • 图像数字化基础
  • 让你的Python代码更简洁:一篇文章带你了解Python列表推导式
  • 基于Matlab的BP神经网络的车牌识别系统(含GUI界面)【W7】
  • jetpack compose的@Preview和自定义主题
  • Temu(拼多多跨境电商) API接口:获取商品详情
  • ArcGIS Pro SDK (五)内容 2 工程项
  • 【ai】初识pytorch