Luat Console,调试神器!

前言:这次教大家使用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输出。

猜你喜欢

转载自blog.csdn.net/a909204013/article/details/81351716