• 欢迎大家分享资料!前往留言板评论即可!

Luat Console,调试神器!

合宙 模组资料网 2年前 (2021-05-15) 367次浏览 0个评论 扫描二维码
                    <p style="outline: 0px; padding: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; text-align: justify; word-break: break-all; font-family: -apple-system, " sf="" ui="" text",="" arial,="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei",="" "wenquanyi="" micro="" hei",="" sans-serif;="" font-variant-ligatures:="" common-ligatures;"="">前言:这次教大家使用Luat的console功能,如果使用过MicroPython,应该对console很熟悉。console,顾名思义,控制台,能做什么? 理论上在脚本运行的功能都可以在控制台执行。有什么好处?举个简单的例子:反转一个字符串,按照之前的步骤,写一个脚本,下载进模块,成功,万事大吉。失败,从头再来。这样的操作很繁琐。</p><p style="outline: 0px; padding: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; text-align: justify; word-break: break-all; font-family: -apple-system, " sf="" ui="" text",="" arial,="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei",="" "wenquanyi="" micro="" hei",="" sans-serif;="" font-variant-ligatures:="" common-ligatures;"="">那么使用了console,就可以这样玩</p><p style="outline: 0px; padding: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; text-align: justify; word-break: break-all; font-family: -apple-system, " sf="" ui="" text",="" arial,="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei",="" "wenquanyi="" micro="" hei",="" sans-serif;="" font-variant-ligatures:="" common-ligatures;"=""><img src="http://oldask.openluat.com/image/show/attachments-2018-09-jp4zWo8N5b9c6c288acc9.jpg" title="Luat Console,调试神器!" class="img-responsive" style="color: rgb(0, 0, 0); font-size: 14px; text-align: start; width: 486px;"></p><div><br></div><p style="outline: 0px; padding: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; text-align: justify; word-break: break-all; font-family: -apple-system, " sf="" ui="" text",="" arial,="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei",="" "wenquanyi="" micro="" hei",="" sans-serif;="" font-variant-ligatures:="" common-ligatures;"="">这里写图片描述</p><p style="outline: 0px; padding: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; text-align: justify; word-break: break-all; font-family: -apple-system, " sf="" ui="" text",="" arial,="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei",="" "wenquanyi="" micro="" hei",="" sans-serif;="" font-variant-ligatures:="" common-ligatures;"="">如果手抖打错一个单词,不要着急,再输入一遍即可。</p><p style="outline: 0px; padding: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; text-align: justify; word-break: break-all; font-family: -apple-system, " sf="" ui="" text",="" arial,="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei",="" "wenquanyi="" micro="" hei",="" sans-serif;="" font-variant-ligatures:="" common-ligatures;"="">所以,使用console,提高调试的效率,加快开发速度。</p><p style="outline: 0px; padding: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; text-align: justify; word-break: break-all; font-family: -apple-system, " sf="" ui="" text",="" arial,="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei",="" "wenquanyi="" micro="" hei",="" sans-serif;="" font-variant-ligatures:="" common-ligatures;"=""><img src="http://oldask.openluat.com/image/show/attachments-2018-09-CXctRBd05b9c6c9c1d1f8.jpg" class="img-responsive" style="color: rgb(0, 0, 0); font-size: 14px; text-align: start; width: 498.4px; height: 297.631px;"></p><p style="outline: 0px; padding: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; text-align: justify; word-break: break-all; font-family: -apple-system, " sf="" ui="" text",="" arial,="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei",="" "wenquanyi="" micro="" hei",="" sans-serif;="" font-variant-ligatures:="" common-ligatures;"="">使用console功能,需要在main.lua里面加入</p><pre class="prettyprint" style="outline: 0px; padding: 8px 16px 6px 56px; margin-bottom: 24px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; position: relative; overflow-y: hidden; line-height: 22px; color: rgb(0, 0, 0); background-color: rgb(40, 44, 52); border-width: initial; border-style: none; border-color: initial; font-variant-ligatures: common-ligatures;"><code class="has-numbering" style="outline: 0px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; padding: 0.5em; line-height: 22px; color: rgb(171, 178, 191); background-color: rgb(40, 44, 52); border-radius: 4px; display: block; overflow-x: auto; white-space: pre; word-wrap: normal; text-size-adjust: none; word-break: break-all;">require "console"

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

  • 1
  • 2

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

Luat Console,调试神器!

注意:如果将跳线帽短接到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

Luat Console,调试神器!

2、Lua string

Luat Console,调试神器!

3、misc

Luat Console,调试神器!

4、AT命令

Luat Console,调试神器!

深入分析

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

<code class="has-numbering" style="outline: 0px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; padding: 0.5em; line-height: 22px; color: rgb(171, 178, 191); background-color: rgb(40, 44, 52); border-radius: 4px; display: block; overflow-x: auto; white-space: pre; word-wrap: normal; text-size-adjust: none; word-break: break-all;">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
</code><ul class="pre-numbering" style="outline: 0px; padding-top: 8px; padding-bottom: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: inherit; word-break: break-all; position: absolute; width: 48px; top: 0px; left: 0px; text-align: right;"><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">1</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">2</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">3</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">4</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">5</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">6</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">7</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">8</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">9</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">10</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">11</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">12</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">13</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">14</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">15</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">16</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">17</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">18</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">19</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">20</li></ul>

1、loadstring

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

<code class="has-numbering" style="outline: 0px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; padding: 0.5em; line-height: 22px; color: rgb(171, 178, 191); background-color: rgb(40, 44, 52); border-radius: 4px; display: block; overflow-x: auto; white-space: pre; word-wrap: normal; text-size-adjust: none; word-break: break-all;">f = loadstring("a = 1")   -- 相当于 function () a = 1 end,返回值为function类型
f()     --执行函数
</code><ul class="pre-numbering" style="outline: 0px; padding-top: 8px; padding-bottom: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: inherit; word-break: break-all; position: absolute; width: 48px; top: 0px; left: 0px; text-align: right;"><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">1</li><li style="outline: 0px; padding: 0px 8px; margin: 0px; font-size: inherit; list-style: none; word-break: break-all; border-right: 1px solid rgb(197, 197, 197); color: rgb(153, 153, 153);">2</li></ul>

2、沙盒

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

3、xpcall

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

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


转载请注明原文链接:Luat Console,调试神器!
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址