其他分享
首页 > 其他分享> > 第二章 AIR202_Lua_串口控制

第二章 AIR202_Lua_串口控制

作者:互联网

我使用的是air202 s6模块,其他模块根据自己的需求做出修改,首先至少熟悉一款单片机接触过编程,最好接触过编程的同学。只为技术交流,高手请指导。。。。。

进入------------------------------------------------------------------>

准备一各代码编辑器,编辑器有很多,推荐使用notepad++、Sublime、text 、VSCode(我是用的就是这款),

VS Code下载链接https://code.visualstudio.com/ 安装教程很简单请移步下文。
1、双击打开安装,下图页面勾选这几个选项,点击下一步到结束    --------- 其他页面根据需求进行设置。


2、在合适的位置新建一个文件夹,命名可以随意,我是用的是UART,使用VS Code打开文件夹,如下图所示:


打开后,在编辑器左侧文件夹中,右击,新建文件,输入 main.lua 和testuart.lua,回车保存:

然后在新建的main.lua内添加下面代码,完成最重要的main.lua文件编写。注意注意 在代码最后一行,另外加入几行换行。代码不再介绍 ,注释里面就有。

PROJECT = "SOCKET-TEST"
VERSION = "1.0.0"


require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
require "sys"
--每1分钟查询一次GSM信号强度,每1分钟查询一次基站信息
require "net"
net.startQueryAll(60000, 60000)
--加载硬件看门狗功能模块
require "wdt"
wdt.setup(pio.P0_30, pio.P0_31)
--加载网络指示灯功能模块
require "netLed"
netLed.setup(true,moduleType == 2 and pio.P1_1 or pio.P2_0,moduleType == 2 and nil or pio.P2_1)
require"testuart"
require"ntp"

require "errDump"
errDump.request("udp://ota.airm2m.com:9072")
--require "ledtest"    --led
ntp.timeSync()
--启动系统框架
sys.init(0, 0)
sys.run()




为了使串口操作反馈,我在里面加过了LED反馈和回复反馈,LED使用GPIO4管脚不知道的可以查看手册,手册我会放在最下面,代码不在一一介绍,都写在注释里。不明白处评论区留言解决。

module(...,package.seeall)
require"utils"
require"pm"


require"pins"  --用到了pin库,该库为luatask专用库,需要进行引用
 
if moduleType == 2 then
    pmd.ldoset(5,pmd.LDO_VMMC)  --使用某些GPIO时,必须在脚本中写代码打开GPIO所属的电压域,配置电压输出输入等级,这些GPIO才能正常工作
end
 
local led1 = pins.setup(pio.P0_4,0) 

 

--串口ID,1对应uart1
--如果要修改为uart2,把UART_ID赋值为2即可
local UART_ID = 1
--缓存数据
local buf = ""
--处理串口数据
local function proc(data)
    data = buf..data
    log.info("testUart.read proc",data)
    local used = true--数据是否被处理?
    if data == "openLED" then
        --模块收到`qwerty`字符串后,回复`asdfgh`字符串
        write("open")
        led1(1)
    elseif data == "closeLED" then
        --模块收到closeLED 回复close
        write("close")
        led1(0) 
    
    else
        --数据没匹配上任何东西,没被使用
        used = false
    end
    if not used then--数据没被使用
        if buf == "" then--如果缓冲区是空的
            sys.timerStart(function()
                buf = ""
            end,500)--500ms后清空缓冲区
        end
        buf = data--数据追加到缓存区
    else
        buf = ""
    end
end
--接收串口数据
local function read()
    local data = ""
    --底层core中,串口收到数据时:
    --如果接收缓冲区为空,则会以中断方式通知Lua脚本收到了新数据;
    --如果接收缓冲器不为空,则不会通知Lua脚本
    --所以Lua脚本中收到中断读串口数据时,每次都要把接收缓冲区中的数据全部读出,这样才能保证底层core中的新数据中断上来,此read函数中的while语句中就保证了这一点
    while true do
        data = uart.read(UART_ID,"*l")
        --数据不存在时停止接收数据
        if not data or string.len(data) == 0 then break end
        --打开下面的打印会耗时
        log.info("testUart.read bin",data)
        log.info("testUart.read hex",data:toHex())
        --真正的串口数据处理函数
        proc(data)
    end
end
--发送串口数据
function write(s)
    log.info("testuart.write",s:toHex(),s)
    uart.write(UART_ID,s)
end
--保持系统处于唤醒状态,此处只是为了测试需要,所以此模块没有地方调用pm.sleep("testUart")休眠,不会进入低功耗休眠状态
--在开发“要求功耗低”的项目时,一定要想办法保证pm.wake("testUart")后,在不需要串口时调用pm.sleep("testUart")
pm.wake("testUart")
--注册串口的数据接收函数,串口收到数据后,会以中断方式,调用read接口读取数据
uart.on(UART_ID,"receive",read)
--配置并且打开串口
uart.setup(UART_ID,9600,8,uart.PAR_NONE,uart.STOP_1)
--模块开机第10秒后,向设备发送`0x01 0x02 0x03`三个字节
sys.timerStart(function()
    write(string.fromHex("010203"))
end,10000)

 

标签:AIR202,end,read,local,require,Lua,串口,data
来源: https://blog.csdn.net/weixin_37180087/article/details/93761988