2026/4/18 12:04:27
网站建设
项目流程
英语教学网站建设意见,中国网络安全厂商排名,套模板网站,沈阳微网站一、lua版本不一样
LuatOS-Air使用的是lua5.1版本#xff0c;本身不支持位移运算符。
LuatOS使用的是lua5.3版本#xff0c;取消了module(..., package.seeall)这种形式的跨文件调用。
二、api不同
首先说明#xff0c;core和脚本有所不同#xff0c;用户可以理解为本身不支持位移运算符。LuatOS使用的是lua5.3版本取消了module(..., package.seeall)这种形式的跨文件调用。二、api不同首先说明core和脚本有所不同用户可以理解为core是安卓/ios系统脚本为一个又一个的app只有core脚本才能支撑起完整的一个二次开发项目。LuatOS-Air的api在https://doc.openluat.com/wiki/21?wiki_page_id2068这里又分为了5.1原生接口提供的额外接口两种。在额外的接口其中又分为了底层接口和二次封装接口底层接口叫做core api二次封装接口叫做script lib api下面会简称为lib层api。core api实现过程不可见封装在了core里受限于和RDA的协议这部分实现过程不开源而lib层的api实现过程可见用户可以自行修改。lib层api一般是将底层提供的接口进行合并与封装更加的简单与易用也有部分lib层api是直接给core发送AT指令然后处理AT指令的返回值并且以函数返回值的形式返回给调用该api的位置。LuatOS的api在https://docs.openluat.com/osapi/这里和LuatOS-Air一样分为了5.3原生接口和合宙提供的额外接口两种。在额外的接口其中又分为了核心库接口和扩展库接口核心库接口叫做core api扩展库接口叫做script lib api下面会简称为lib层api。core api实现过程不可见封装在了core里这部分实现过程不开源而lib层的api实现过程可见用户可以自行修改。LuatOS 核心库是在底层实现的功能库调用核心库无需代码使用 require 操作LuatOS 扩展库是用 Lua 脚本实现的功能库必须用 requre 调用才能够使用扩展库。三、跨文件调用方式不同LuatOS-Air跨文件调用方式LuatOS-Air在每一个非main.lua的文件头部第一行可执行代码永远是module(..., package.seeall)主要作用是将该文件中所有的全局变量/全局函数加入到一张名为 _G的table中方便其他.lua文件调用在这里不做过多讲解能有转移需求的客户基本都会LuatOS-Air的跨文件调用方法。luatos跨文件调用方式luatos跨文件调用方式有两种一种和LuatOS-Air类似不过是在文件第一行新建一个和文件名相同的table文件结尾处return这个table接下来举个例子首先封装一个函数---函数功能-- 生成从1-max的table-- 输入值table的最大值-- 返回 table结果-- 例子 local list getNumberList(10)function getNumberList(max)local t {}for i1,max dotable.insert(t,i)endreturn tend我们新建一个文件叫tools.lua把这个函数放进去现在整个文件如下面这样tools.lua---函数功能-- 生成从1-max的table-- 输入值table的最大值-- 返回 table结果-- 例子 local list getNumberList(10)local function getNumberList(max)local t {}for i1,max dotable.insert(t,i)endreturn tend--手动返回一个table包含了上面的函数return {getNumberList getNumberList,}现在我们封装的这个函数就能在其他文件(例如main.lua)里被调用了具体代码如下--引用tools.lua文件并加载local tool require(tools)local list tool.getNumberList(12)当调用了require接口后Lua虚拟机会自动加载你调用的文件执行文件的内容然后返回你文件里return的结果。为了更好地理解这段话我们可以看下面两个文件其中main.lua是被运行的那个入口文件test.lua--以便一会儿返回使用的tablelocal temp {}--把全局变量a更改了a 1--local变量无法被外部调用--但是可以在文件内被调用local b 2--文件在被require的时候会被执行--把全局变量c更改了c a b--使函数在table里function temp.addB() --文件内部可以调用变量b b b 1 return bend--返回tablereturn tempmain.lua-- LuaTools需要PROJECT和VERSION这两个信息PROJECT adcdemoVERSION 1.0.0log.info(main, PROJECT, VERSION)-- 添加硬狗防止程序卡死if wdt then wdt.init(9000) -- 初始化watchdog设置为9s sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗endlocal test require(test)--引用test.lua,这里require的作用如果不是很清楚可以类比成C语言中的#include当然熟悉lua和C语言的用户可以很明确的知道require和#include的区别但是方便新用户理解可以暂时当成#include来看待print(a)--输出1print(b)--输出nil因为b是local变量print(c)--输出3print(test.addB())--输出3print(test.addB())--输出4print(test.addB())--输出5同时每个文件最多只会被require一次如果有多个require只有第一次会执行-- 用户代码已结束----------------------------------------------- 结尾总是这一句sys.run()-- sys.run()之后后面不要加任何语句!!!!!此处为第一种调用方法简单来说被调用文件头部将module(..., package.seeall)换成文件名{}文件末尾处加return {本文件中写的函数名本文件中写的函数名}有多个函数的时候可以添加多个元素名 元素名进table里。第二种调用方法依旧是在文件开头写上文件名{}不同的是需要被调用的函数名可以写成文件名.函数名的形式最后的return不需要return一个很长的table了只需要return 文件名例如需要在main.lua 中调用test.lua的test函数那么除了固定格式以外的main.lua可以写成testrequire(test)test.test()而test.lua中完整的样子为test {}function test.test()log.info(“我被调用了”)endreturn test四、实例以uart的demo为例笔者将带着用户将LuatOS-Air uart的demo移植到luatos上仅讲解uart1的移植过程其他串口通用除去无关本次移植过程的部分LuatOS-Air的uart1完整demo如下是一个自发自收的测试demoluatos完整的demo也会放在最后方便用户对比。开始移植1、main.lua的改造PROJECT和VERSION这两个参数不变下载时候需要这两个参数require log这句可以删除底层已经写好了log库并提供了和LuatOS-Air lib层api几乎一致的core api查看对应的 luatos log库api https://docs.openluat.com/osapi/core/log/后得知几种日志模式的常量有所不同所以LOG_LEVEL log.LOGLEVEL_TRACE这句可以改成LOG_LEVEL log.LOG_INFO再添加一句log.setLevel(LOG_LEVEL )因为主逻辑都在testUart1文件中不需要在main.lua中调用所以保持 require testUart1 原样即可为了用户更直观的看出跨文件调用的不同所以我在testUart1中又写了一个名为function_name的函数然后在main.lua中进行循环调用。sys.init函数不需要直接删去即可完成上述步骤以后main.lua就被我们改造成了下面这样2、testUart1.lua的改造接下来进入testUart1.lua中module(...,package.seeall)改为 testUart1 {}pm和utils两个库utils不需要直接删除pm库底层提供了无需require也删除。接下来会先将proc、read、write、writeOk和我刚刚写的function_name这几个函数会加载到内存中但是还没有执行接下来执行的是pm.wake(testUart)查看luatos的pm接口可以看到luatos没有wake接口但是有不休眠模式所以先设置下不休眠也就是将pm.wake(testUart)换成pm.request(pm.NONE)然后执行的是uart.on两个注册函数当时串口有接收事件产生时候会去执行read函数当串口有发送事件产生时会执行writeOK函数对比luatos的注册串口收发事件,可以看出这两个芯片收发事件函数一致无需更改。最后执行的是串口设置指令LuatOS-Air和luatos有很大不同这两个接口LuatOS-Air的和luatos最大区别就是LuatOS-Air将485半自动收发控制分开了单独写了一个uart.set_rs485_oe而luatos将其写在了一起用户在使用该接口时一定要注意不同接口之间参数的位置。当有串口接收事件产生时模块会进入read函数在read函数里打印了data原始数据和转成hex以后的数据后便进入了proc函数中并且将串口来的数据传入给proc函数进行处理。值得注意的是read函数里有将串口来的数据通过uart.read函数赋值给data变量这个操作但是luatos截至当前文章完成时uart.read函数的第二个参数只能填number意为每次接收的字节数也就是需要将代码中的uart.read(UART_ID,*l)换成uart.read(UART_ID,1024)后面这个1024为uart.setup的第7个参数串口缓冲区你设置的大小未设置默认为1024字节如果需要用户自行设置则最小512最大4096而当有串口发送事件产生时模块会进入writeOk函数该函数比较简单就打印了下发送成功字样。最后一行因为有跨文件调用所以需要return 文件名也就是加一句return testUart1最后整个testUart1.lua就被我们改造成了这样至此 整个改造过程结束