1 -- LuaTools需要PROJECT和VERSION这两个信息
8 本demo 适用于 Air780E/Air780EG/Air600E
10 2. 需要 LuaTools 2.1.89 及以上的升级文件生成
13 1. main.lua 本文件, 是下载到模块的唯一文件
14 2. fota_uart.bin 演示用的脚本升级文件,不需要下载到模块
15 3. main.py 上位机发送升级包的程序, 不需要下载到模块
17 fota_uart.bin 使用 LuaTools 的 "量产文件" 按钮进行生成, .bin后缀的就是脚本OTA文件
20 1. 先把脚本和固件烧录到模块里, 并确认开机
21 2. 进入命令行程序, 执行 python main.py 升级
22 3. 观察luatools的输出和main.py的输出
23 4. 模块接收正确的升级数据后,会提示1秒后重启
24 5. 本demo自带的脚本升级包,升级后是GPIO闪灯的demo
26 注意: 本demo默认是走虚拟串口进行交互, 如需改成物理串口, 修改uart_id和main.py
29 _G
.sys
= require
"sys"
32 -- uart_id = 1 -- 物理UART1, 通常也是MAIN_UART
33 uart_id
= uart
.VUART_0
-- 虚拟USB串口
35 -- 循环打印当前版本, 从而直观表示是否升级成功
36 -- sys.taskInit(function()
39 -- log.info("fota", "version", VERSION)
44 uart_zbuff
= zbuff
.create(1024)
45 uart
.setup(uart_id
, 115200)
48 local uart_fota_state
= 0
49 local uart_rx_counter
= 0
50 local uart_fota_writed
= 0
51 uart
.on(uart_id
, "receive", function(id
, len
)
53 if uart_zbuff
:used() > 8192 then
54 log.warn("fota", "uart_zbuff待处理的数据太多了,强制清空")
58 local len
= uart
.rx(id
, uart_zbuff
)
62 -- if #s > 0 then -- #s 是取字符串的长度
63 uart_rx_counter
= uart_rx_counter
+ len
64 log.info("uart", "收到数据", len
, "累计", uart_rx_counter
)
65 if uart_fota_state
== 0 then
66 sys
.publish("UART_FOTA")
71 sys
.taskInit(function()
72 local fota_state
= 0 -- 0还没开始, 1进行中
75 sys
.waitUntil("UART_FOTA", 1000)
76 local used
= uart_zbuff
:used()
78 if fota_state
== 0 then
81 local data
= uart_zbuff
:query()
83 -- 如果接受到 #FOTA\n 代表数据要来了
84 if data
:startsWith("#FOTA") and data
:endsWith("\n") then
86 log.info("fota", "检测到fota起始标记,进入FOTA状态", data
)
88 -- 固件数据发送端应该在收到#FOTA RDY\n之后才开始发送数据
89 uart
.write(uart_id
, "#FOTA RDY\n")
93 uart_fota_writed
= uart_fota_writed
+ used
94 log.info("准备写入fota包", used
, "累计写入", uart_fota_writed
)
95 local result
, isDone
, cache
= fota
.run(uart_zbuff
)
96 log.debug("fota.run", result
, isDone
, cache
)
97 uart_zbuff
:del() -- 清空缓冲区
101 uart
.write(uart_id
, "#FOTA ERR\n")
102 log.info("fota", "出错了", result
, isDone
, cache
)
106 local succ
, fotaDone
= fota
.isDone()
109 uart
.write(uart_id
, "#FOTA ERR\n")
110 log.info("fota", "出错了")
115 log.info("fota", "已完成,1s后重启")
117 uart
.write(uart_id
, "#FOTA OK\n")
124 log.info("fota", "单包写入完成", used
, "等待下一个包")
125 uart
.write(uart_id
, "#FOTA NEXT\n")
132 -- 用户代码已结束---------------------------------------------
135 -- sys.run()之后后面不要加任何语句!!!!!