查看原文
其他

开发利器!Luat Console

Leng 合宙Luat 2020-01-17

前言:今天继续从裤裆里面掏东西。这次教大家使用Luat的console功能,如果使用过MicroPython,应该对console很熟悉。console,顾名思义,控制台。能做什么? 理论上在脚本运行的功能都可以在控制台执行。有什么好处?


举个例子:反转一个字符串,按照之前的步骤,写一个脚本,下载进模块,成功,万事大吉。失败,从头再来。这样的操作很繁琐。

那么使用了console,就可以这样玩

如果手抖打错了一个单词,不要着急,再输一遍即可。所以,使用console,提高调试的效率,加快开发速度。



使用console功能,需要在main.lua里面加入


require "console"

console.setup(1, 115200) -- 设置为串口1,波特率为115200


console是通过串口输入,可以使用USB转TTL连接UART,也可以将跳线帽短接UART,使用USB接口 。

注意:如果将跳线帽短接到UART,USB连接的UART,只能进行标准的UART通信。如果要下载程序,打印trace,则需要短接到HOST口上。

在使用前需要做几个名词解释:

API:Luat Lib下面由lua编写的API

Lua API:Lua语言自带的API

扩展API:用C语言实现的,在lod里面。

扩展API和Lua API直接可以通过console调用,API需要在脚本里require后才能调用,举个例子:如果使用http,那么需要在main.lua里面require "http"。什么?API说明哪儿找? 当然上wiki

进入正题,打开串口调试助手,选择串口,波特率。

举几个例子,感受一下

1、json

2、Lua string

3、misc

4、AT命令



深入分析

将console的核心代码提取,精简


newfenv = {                          -- 沙盒新环境,并重写print函数。

    print = function( ... )

    print(arg[1].."test")

    end

}


setmetatable(newfenv,{__index = _G}) --新环境继承_G全局表


--xpcall捕捉脚本异常

xpcall(function()

        local line = "print(1)"

        local f = loadstring(line)

        setfenv(f, newfenv) --在沙盒中执行f()函数

        f()

    end,

    function() -- 错误输出

       print(debug.traceback())

    end

)

--输出结果  1test


1、loadstring

Lua里面可以使用loadstring来加载一个字符串,返回function。


f = loadstring("a = 1")   -- 相当于 function () a = 1 end,返回值为function类型

f()  --执行函数

2、沙盒

出于安全或者改变一些内置函数行为的目的,某些程序在沙盒中执行,即使程序崩溃,也不会影响全局域。newfenv为沙盒环境,这儿重写了print函数,在第一个参数后面添加test输出。

3、xpcall

xpcall类似于JAVA中的try.....catch...进行脚本的异常捕捉。

在理解了上面程序后,不难了解console的运行过程。从串口接收到数据后,执行串口接收中断程序,通过loadstring将串口数据包装为function,重写print和sendat函数,在沙盒中运行,并将结果通过uart输出。

小蛮儿童手表的游戏在线下载并加载也是基于此原理。后续某大神会出的远程写代码的功能,原理亦如此,敬请期待。欢迎大家评论区讨论学习,分享新的玩法。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存