菜单

自由协议教程

下载

说明:本教程演示一个自由协议 具体如下
双控件通信: 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. 新建工程,设置串口协议为自定义协议

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

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

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. 模拟运行

点击项目运行

2.1. 字设置写入常量 0

2.2. 数值框写入常量 100

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

上一个
三菱FX3U编程口协议
下一个
资源下载链接
最近修改: 2026-08-10Powered by