本节以“保存配方、从SD卡恢复配方”为例,介绍Lua文件读写。示例将温度、转速、批量三个参数保存为CSV文件,重新上电后可从卡中恢复。
核心功能
本功能适用于具有SD卡接口、固件支持SD文件系统和Lua文件I/O的屏幕。使用前应确认SD卡已被固件识别并挂载到
/sdcard。
示例路径为/sdcard/recipe.csv,对应SD卡根目录下的recipe.csv。文件包含三个以英文逗号分隔的非负十进制整数,末尾为回车换行\r\n。
253,1200,50
上例表示温度25.3℃、转速1200rpm、批量50件。CSV保存的是寄存器原始整数,温度采用“实际值×10”,所以第一项是253,不是25.3。
下表地址均为十六进制,数据类型均为UINT16。Lua地址类型为VT_LW=1。
| 地址 | 用途 | 说明 |
|---|---|---|
| LW1000 | 温度×10 | 原始253显示25.3℃;原始范围0~65535 |
| LW1001 | 转速 | 整数,单位rpm |
| LW1002 | 批量 | 整数,单位件 |
| LW1010 | 命令 | 1保存、2恢复、3填入示例、4清零参数;处理后归0 |
| LW1011 | 结果状态 | 见下文状态表 |
| LW1012 | 保存成功计数 | 本次运行累计,重启归0,16位循环计数 |
| LW1013 | 恢复成功计数 | 本次运行累计,重启归0,16位循环计数 |
| 方法 | 用途 |
|---|---|
io.open("/sdcard/recipe.csv", "wb") |
打开或创建文件,覆盖原内容 |
f:write(text) |
写入CSV文本 |
f:close() |
关闭文件并检查结果 |
io.open("/sdcard/recipe.csv", "rb") |
只读打开已有文件 |
f:read(65) |
最多读取65字节,用于检查文件是否超过64字节 |
保存时,Demo读取三个LW参数并生成CSV文本;写入并关闭文件后,再次打开文件核对读回内容。只有读回字节与写入内容一致时,界面才显示“保存成功,回读一致”。关键代码如下,完整错误处理及回调接入见Demo中的scripts/main.lua。
local VT_LW = 1
local text = string.format("%d,%d,%d\r\n",
get_uint16(VT_LW, 0x1000),
get_uint16(VT_LW, 0x1001),
get_uint16(VT_LW, 0x1002))
local f, open_err = io.open("/sdcard/recipe.csv", "wb")
assert(f, open_err)
local ok, write_err = f:write(text)
local closed, close_err = f:close()
assert(ok and closed, write_err or close_err)
恢复时,Demo限制文件不超过64字节,用下面的匹配式读取三个整数,再检查每项是否在0~65535范围内。空文件、字段缺失、小数、负数、多余字段和超范围数值均拒绝恢复。三项全部通过校验后才写入LW参数,文件校验失败不会造成部分参数恢复。
local a, b, c = text:match("^(%d+),(%d+),(%d+)%s*$")
四个普通字设置按钮向LW1010写入命令,由全局周期回调on_run处理。命令被接收后先清零,再执行一次操作;pcall捕获文件错误,并将结果写入LW1011。
不能仅在main.lua顶层写
return function(command) ... end就期待自动执行。操作函数需要接到实际回调或控件动作。合并到已有工程时应保留原业务回调,不要重复添加同名功能块;可参考Demo中对原on_init和on_run的保留方式。
| 状态码 | 含义 |
|---|---|
| 0 / 1 | 就绪 / 处理中 |
| 2 / 3 | 保存且回读一致 / 恢复成功 |
| 4 | 文件打开失败,检查SD卡、挂载、文件及写入权限 |
| 5 | 文件写入或关闭失败 |
| 6 / 7 / 8 | 文件为空或格式错误 / 文件超过64字节 / 参数超出UINT16范围 |
| 9 | 保存后回读不一致 |
| 10 / 11 | 参数已清零 / 已填示例参数 |
| 12 / 13 | 命令错误 / 文件读取或关闭失败 |
| 示例 | 下载 |
|---|---|
| 2.8寸SD卡配方读写,240×320,ApusTAI可编辑工程 | SD配方读写测试_2.8寸_图片按钮.apustai |
Demo型号为E028R2432,由ApusTAI 1.0.49生成。界面提供三个数值输入,以及“保存到SD”“从SD恢复”“示例参数”“清零参数”四个图片按钮。按钮通过浅色凸起、深色下沉区分操作状态,图片内仅显示功能名称和图标;命令在松手时执行。
recipe.csv,内容为253,1200,50。检查屏幕是否支持SD卡、卡是否已挂载到/sdcard、路径和文件名是否正确,以及是否具备写入权限。首次使用尚未保存文件时,直接恢复也会因文件不存在而失败。
温度寄存器按实际值的10倍保存,数值控件设置1位小数进行显示和输入。转速、批量按整数保存,不做此缩放。
Windows模拟器不会自动将/sdcard映射为实体SD卡。电脑端出现“打开失败”时,应先检查模拟文件路径,不能据此判定屏端SD卡故障。Demo已完成编译、文件逻辑和原生控件交互验证;实体SD卡的挂载、读写及断电后恢复仍需在实际屏幕上确认。
会。wb会覆盖同名旧文件,示例采用单文件覆盖方式。写入过程中断电可能留下不完整文件,重要配方应另行备份。不要连续高速发送保存命令或在写入时拔卡。