Bootstrap

【纸飞机串口调试工具】Lua数据处理

纸飞机串口工具介绍

纸飞机一款性能强劲且专业的串口/网络/HID调试助手,具有多窗口绘图、关键字高亮、数据分窗和数据过滤等众多功能,可以极大的方便嵌入式开发人员的调试过程。本文介绍Lua数据处理。

软件下载

下载链接:https://io.comassistant.cn/
绘图教程:https://www.bilibili.com/video/BV1E3411E7vu
功能演示:https://www.bilibili.com/video/BV1df4y1k71h

Lua介绍

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

功能介绍

纸飞机通过集成Lua脚本,可以在不损失性能的情况下,更灵活的让用户自定义的处理数据。这在曲线滤波、文本数据更换(增删改)等场合下特别适用。同时,经过笔者评估,Lua的学习并不难,因为大多数情况下,我们还是只用到了常见的那几个Lua语法。

功能演示

功能使能

我们可通过以下路径打开Lua功能
在这里插入图片描述
打开后,纸飞机会自动在软件目录下新建:

  • 快速教程文件:lua_quick_manual.html
  • Lua脚本文件:ComAssistant.lua
  • 脚本日志文件:ComAssistant.lua.log

在这里插入图片描述
在这里插入图片描述

快速教程文件

Luau快速教程文件是笔者为方便降低大家学习Lua的门槛,亲自整理的一个文档,只覆盖了常用的Lua语法,大约只需要翻6次屏幕就可以阅读完,用浏览器即可打开,这里不再展开赘述

在这里插入图片描述

Lua脚本文件

该文件是整个功能的核心,里面主要是内置了一些预定义函数和预定义变量,纸飞机会调用这些函数或变量。

--[[
【使用说明】
    # Lua教程:纸飞机在软件目录下释放了简短的入门教程文件,您也可以访问https://www.runoob.com/lua/lua-tutorial.html进行系统的学习
    # 所有下划线__开头的变量会被纸飞机调用:
        不可修改/删除名字和值;
    # 所有下划线__开头的函数会被纸飞机调用:
        不可修改、删除函数名称;
        不可修改参数顺序、个数
        不可修改返回值类型、个数;
        但你可修改函数内部的实现,也可以添加自定义的函数
    # 任何语法错误会导致脚本整体失效,请认真检查您的脚本
    # 本文件的编码格式约定为UTF-8,使用LF作为换行符
--]]

-- 脚本文件版本
__version = 1

-- 函数功能:初始化函数,打开Lua功能后会执行一次
function __init()
    io.output(io.open('ComAssistant.lua.log', 'a'))   -- 重定向输出到文件,用于调试
end

-- 函数功能:反初始化函数,关闭Lua功能后会执行一次
function __deinit()
    io.close()
end

-- 函数功能:该函数打印调试日志,日志会被打印到ComAssistant.lua.log文件
function print(data)
    io.write(os.date("%Y-%m-%d %H:%M:%S ") .. data .. "\n")
    io.flush()
end

-- 函数功能:该函数实现自动应答功能
-- 输入参数data:纸飞机收到的原始数据
-- 返回参数:当ackData不为空时,纸飞机会将它发送出去
function __auto_reply(data)
    ackData = ""
    return ackData
end

-- 函数功能:该函数对发送的数据进行处理
-- 输入参数data:纸飞机计划发送出去的数据
-- 返回参数:纸飞机即将发送出去的数据
function __before_send(data)
    return data
end

-- 函数功能:该函数对即将显示到绘图器上的数据进行处理
-- 输入参数window: 当前数据所属的窗口,类型为字符串
-- 输入参数data:即将显示到绘图器窗口的曲线数据,类型为数组
-- 返回参数:纸飞机将使用返回的数据显示到绘图器上,类型为数组
function __before_plotter_window(window, data)
    return data
end

-- 函数功能:该函数对即将显示到频谱仪上的数据进行处理
-- 输入参数window: 当前数据所属的窗口,类型为字符串
-- 输入参数data:即将显示到频谱仪的曲线数据,类型为数组
-- 返回参数:纸飞机将使用返回的数据进行FFT运算,类型为数组
function __before_fft_window(window, data)
    return data
end

-- 函数功能:该函数对即将显示到过滤器上的数据进行处理
-- 输入参数window: 当前数据所属的窗口,类型为字符串
-- 输入参数data:即将显示到过滤器窗口的一行数据,类型为字符串
-- 返回参数:纸飞机将使用返回的数据显示到过滤器上,类型为字符串
function __before_filter_window(window, data)
    return data
end

-- 函数功能:该函数对即将显示到数据分窗器上的数据进行处理
-- 输入参数window: 当前数据所属的窗口,类型为字符串
-- 输入参数data:即将显示到数据分窗窗口的一行数据,类型为字符串
-- 返回参数:纸飞机将使用返回的数据显示到数据分窗器上,类型为字符串
function __before_spliter_window(window, data)
    return data
end

用户需要理解这段代码,但简单来讲,其实就是对应的功能在显示前额外执行了一个钩子函数,方便我们对数据进行预处理,大概数据流图如下:

在这里插入图片描述

假设我们要对filter自定义过滤窗口的数据增加前缀HELLO_PREFIX:,那么其对应的脚本钩子函数为

__before_filter_window,我们可以重新修改其实现

-- 函数功能:该函数对即将显示到过滤器上的数据进行处理
-- 输入参数window: 当前数据所属的窗口,类型为字符串
-- 输入参数data:即将显示到过滤器窗口的一行数据,类型为字符串
-- 返回参数:纸飞机将使用返回的数据显示到过滤器上,类型为字符串
function __before_filter_window(window, data)
	-- 使用两个点..来进行字符串拼接
    return "HELLO_PREFIX:"..data
end

那么Lua处理效果如下

在这里插入图片描述
在这里插入图片描述

可以看到,main窗口收到的数据是没有HELLO_PREFIX:信息的,但是filter窗口会多出这么一个数据,正是Lua脚本在起作用。

The END

;