说明:本教程演示一个自由协议 具体如下
双控件通信: 0x1000 (数值框) + 0x1002 (字设置按钮), 均可读写
协议帧: AA 55 <Hi> <Lo> 00 (5字节, 大端)
- 用户编辑任一控件 → UART 发出帧
- UART 收到帧 → 更新 0x1000 显示

下载链接:
https://help.simtutai.cn/docs/zi-yuan-xia-zai-lian-jie
1.1. 新建工程,设置串口协议为自定义协议

1.2. 绑定控件地址分别为0x1000, 0x1002

1.3. 编辑lua脚本自定义收发

_ENCRYPT_=0 --LUA脚本加密
--****************警告 Warning*****************************
--
--
--*********************************************************
--数据类型定义
--VTYPE
LW = 1 --变量地址
RW = 2 --FLASH存储
--[[
双控件通信: 0x1000 (数值框) + 0x1002 (字设置按钮), 均可读写
协议帧: AA 55 <Hi> <Lo> 00 (5字节, 大端)
- 用户编辑任一控件 → UART 发出帧
- UART 收到帧 → 更新 0x1000 显示
--]]
local FRAME_H0 = 0xAA
local FRAME_H1 = 0x55
local FRAME_LEN = 5
local UART_ID = 0
local REG_DISP = 0x1000 -- 数值框
local REG_SEND = 0x1002 -- 字设置按钮
-- 防止 UART 接收 → set_uint16 → on_update → 死循环
local _rcv_lock = false
--------------------------------------------------------------------------
-- 内部函数
--------------------------------------------------------------------------
local function _clamp(v)
if type(v) ~= "number" then return 0 end
v = math.floor(v)
if v < 0 then return 0 end
if v > 0xFFFF then return 0xFFFF end
return v
end
local function _is_ok(pkt, len)
if not pkt or not len or len < FRAME_LEN then return false end
if pkt:byte(1) ~= FRAME_H0 or pkt:byte(2) ~= FRAME_H1 then return false end
return true
end
local function _send(ch, val)
val = _clamp(val)
local hi = (val >> 8) & 0xFF
local lo = val & 0xFF
uart_send(ch or UART_ID, {FRAME_H0, FRAME_H1, hi, lo, 0x00})
end
--------------------------------------------------------------------------
-- 回调
--------------------------------------------------------------------------
function on_init()
end
function on_run(screen)
end
-- 任一控件写入 → UART 发出
function on_update(slave, vtype, addr)
if _rcv_lock then return end
if addr == REG_DISP or addr == REG_SEND then
local val = get_uint16(vtype, addr)
if val ~= nil then
_send(UART_ID, val)
end
end
end
function on_draw(screen_id, control_id)
end
-- UART 接收 → 更新 0x1000, 锁定避免回环
function on_uart_recv(ch_id, packet, length)
if not _is_ok(packet, length) then return end
local hi = packet:byte(3) or 0
local lo = packet:byte(4) or 0
local val = hi * 256 + lo
_rcv_lock = true
set_uint16(LW, REG_DISP, _clamp(val))
_rcv_lock = false
end
点击项目运行

2.1. 字设置写入常量 0

2.2. 数值框写入常量 100

2.3. 串口发送更改数值框值为9
