在被动模式基础上增加主动读取能力:HMI 主动向设备发查询帧并读取响应。适合 HMI 做主设备的私有协议对接。
1. 新增 API
| 函数 | 说明 |
|---|---|
| uart_rxsize(ch) | 查询接收缓冲字节数 |
| uart_recv(ch, size) | 主动读取指定字节数(size≥1),返回下标从 1 的字节表 |
| uart_rxclear(ch) | 清空接收缓冲 |
| calc_crc16(data) | Modbus CRC-16 计算(低字节在前) |
⚠️ 主动读需要工程属性里串口设置 → 接收回调 → 禁用,否则和 on_uart_recv 冲突。

2. 案例:XGUS 协议映射
帧格式:5A A5 + 长度 1B + 指令 1B + 数据 + CRC(可选)。指令 0x82 写、0x83 读。
官方提供基于协程 + 元表的非阻塞框架 XGUS.lua:
dofile("XGUS.lua")
xgus = XGUS:new(0, 0x55AA, true, true)
-- 读从机 0x55AA 的 0x0000 地址 10 个字
local data = xgus:read(0x0000, 10)
if data then
set_uint16(VT_LW, 0x2000, data[1])
end
-- 写地址 0x0100
xgus:write(0x0100, {0x12, 0x34})
协程框架的好处:脚本层写起来像同步调用,底层自动处理”发请求→等响应→超时重试”,不阻塞 on_run 主循环。

主动模式三注意:①必须禁用接收回调(工程串口设置里),否则 on_uart_recv 和 uart_recv 抢数据;②calc_crc16 是 Modbus CRC-16,低字节在前;③主动读要防设备无响应——框架内部有超时机制,自己写的话务必加超时。
整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「自由串口协议(主动)」,版权归大彩科技所有。
发表回复