第二章 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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章