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


    1. #!/bin/bash
    2. #logPath 写日志的存放路径
    3. #logPath=/home/workspace/tvs/trainborne
    4. logPath=/home/firefly
    5. tmpFile=$$
    6. function getLogName()
    7. {
    8. #echo "$logPath/LCDController_"`date +"%Y%m%d000000.log"`
    9. echo "LCDController_20240424000000.log"
    10. }
    11. # 串口设备文件
    12. SERIAL_PORT="/dev/ttyS0"
    13. # 设置串口参数
    14. stty -F $SERIAL_PORT 9600 cs8 -cstopb -parenb
    15. # 要发送的16进制数据,这里以 "48 65 6c 6c 6f"(即 "Hello" 的ASCII码)为例
    16. 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"
    17. 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"
    18. # 使用printf发送16进制数据,注意前面加上了'\x'来指定是16进制
    19. # 这里使用了一个循环来遍历HEX_DATA中的每个值
    20. closeScreen()
    21. {
    22. # echo `date +"%Y-%m-%d %H:%M:%S"`" closeScreen" >>tmp.log
    23. echo `date +"%Y-%m-%d %H:%M:%S"`" closeScreen"
    24. OLD_IFS=$IFS
    25. IFS=' ' # 设置内部字段分隔符为空格
    26. read -ra ADDR <<< "$CLOSE_HEX_DATA" # 将HEX_DATA分割为一个数组
    27. IFS=$OLD_IFS # 恢复原始的内部字段分隔符
    28. for byte in "${ADDR[@]}"; do
    29. printf "\\x$byte" > $SERIAL_PORT
    30. done
    31. }
    32. openScreen()
    33. {
    34. echo `date +"%Y-%m-%d %H:%M:%S"`" openScreen" >>tmp.log
    35. echo `date +"%Y-%m-%d %H:%M:%S"`" openScreen"
    36. OLD_IFS=$IFS
    37. IFS=' ' # 设置内部字段分隔符为空格
    38. read -ra ADDR <<< "$OPEN_HEX_DATA" # 将HEX_DATA分割为一个数组
    39. IFS=$OLD_IFS # 恢复原始的内部字段分隔符
    40. for byte in "${ADDR[@]}"; do
    41. printf "\\x$byte" > $SERIAL_PORT
    42. done
    43. }
    44. function Test()
    45. {
    46. closeScreen
    47. sleep 2
    48. openScreen
    49. exit 0
    50. }
    51. echo "执行$0 test 可以测试串口开关屏"
    52. if [ "$1" == "test" ]; then
    53. echo "call test"
    54. Test
    55. exit 0
    56. fi
    57. # 如果你知道发送的数据量并且想要一次发送所有字节(注意:这可能在某些shell中不起作用)
    58. # echo -ne '\x48\x65\x6c\x6c\x6f' > $SERIAL_PORT
    59. # 注意:上面的-ne选项在bash中是有效的,但在某些shell中可能不支持
    60. # 读取并显示来自串口的响应(如果需要的话)
    61. # cat $SERIAL_PORT
    62. log=$(getLogName)
    63. grep -rn "trun on" $log |awk '{print $1}'> $tmpFile
    64. i=0
    65. while read -r value;
    66. do
    67. strArray["$i"]="$value"
    68. i=$((i+1))
    69. done < $tmpFile
    70. rm $tmpFile
    71. i=$((i-1))
    72. if [ $i -ne "-1" ]; then
    73. tmp=${strArray[$i]}
    74. tmp=`echo $tmp|cut -d':' -f1`
    75. i=$((tmp+8))
    76. tmp=`sed -n "$i"p $log`
    77. tmpDate=`echo $tmp|cut -d'.' -f1`
    78. timeStampTmp=`date -d "$tmpDate" +%s`
    79. now=`date`
    80. timeStampNow=`date -d "$now" +%s`
    81. diff=$((timeStampNow-timeStampTmp))
    82. if [ $diff -lt 60 ]; then
    83. echo `date +"%Y-%m-%d %H:%M:%S"`" grep string $tmp" >tmp.log
    84. echo `date +"%Y-%m-%d %H:%M:%S"`" grep string $tmp"
    85. tmp=`echo $tmp|cut -d':' -f6`
    86. if [ $tmp == 31 ]; then
    87. echo "open screen" >> tmp.log
    88. openScreen
    89. else
    90. echo "close screen" >> tmp.log
    91. closeScreen
    92. fi
    93. fi
    94. fi
    95. 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`

  • 相关阅读:
    Mediapipe 实现3D人脸检测
    python抽取pdf中的参考文献
    springboot-rabbitmq-reply 消息直接回复模式
    练习26-34:日期函数,ifnull函数
    深度置信网络(DBN)【经典的DBN网络结构是由若干层 RBM(受限波尔兹曼机)和一层 BP 组成的一种深层神经网络】
    Go : for 语句简单使用
    深入liunx内核理解epoll
    Gitter+Sidecar制作聊天室
    java连接mysql8.0.28数据库实例
    中医-常用药食同源的食物功效作用
  • 原文地址:https://blog.csdn.net/mct123/article/details/139607352