前言:这次教大家使用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输出。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!