自由协议由 Lua 定义帧格式和收发规则。本节接收四字节水温报文,更新海岸泵站画面。
核心功能
在 工程 → 设置 → 工程设置 中配置通信参数。

| 序号 | 参数 | 本例 | 作用 |
|---|---|---|---|
| 1 | 波特率 | 115200 | 公共串口参数,见 6.1 DCBUS。 |
| 2 | 数据位 | 8 | 公共串口参数,见 6.1 DCBUS。 |
| 3 | 校验位 | 无 | 公共串口参数,见 6.1 DCBUS。 |
| 4 | 停止位 | 1位 | 公共串口参数,见 6.1 DCBUS。 |
| 5 | 接收回调 | 是 | 将接收字节交给 Lua 的 on_uart_recv;自由协议示例开启。 |
| 6 | 协议类型 | 自定义 | 选择当前工程使用的通信协议。 |
| 7 | 间隔时间ms | 50 | 通信报文之间的调度间隔;不等于所有变量的刷新周期。 |
| 8 | 同步画面 | 否 | 公共设置,见 6.3 Modbus 主站 的“公共参数”。 |
| 9 | 画面写入地址 | 未设置 | 公共设置,见 6.3 Modbus 主站 的“公共参数”。 |
| 10 | 画面取自地址 | 未设置 | 公共设置,见 6.3 Modbus 主站 的“公共参数”。 |
| 11 | 字节序 | 默认大端 | 公共设置,见 6.3 Modbus 主站 的“公共参数”。 |
本例开启 接收回调,在 Lua 中处理数据。串口的“间隔时间”不替代帧长度、校验或脚本定时器。

| 字段 | 字节数 | 示例 |
|---|---|---|
| 帧头 | 2 | AA 55 |
| 水温值 | 2 | 高字节在前,00 09 表示 9 |
25:AA 55 00 19
32:AA 55 00 20
9:AA 55 00 09
接收值写入 LW1000,水温数值及进度条绑定同一地址。液位与转速为本地画面演示,不参与这个四字节协议。
一次回调可能只有半帧,也可能包含多帧。保留未完成数据,凑齐后再处理。
local LW = 1
local rx = ""
function on_uart_recv(channel, packet, length)
if channel ~= 0 then return end
rx = rx .. packet
while #rx >= 2 do
local first, second = string.byte(rx, 1, 2)
if first ~= 0xAA or second ~= 0x55 then
rx = string.sub(rx, 2)
elseif #rx < 4 then
break
else
local high, low = string.byte(rx, 3, 4)
set_uint16(LW, 0x1000, high * 256 + low)
rx = string.sub(rx, 5)
end
end
end
示例未定义 CRC、确认或重发;接入设备时按对端规范补充。同名回调只保留一份,已有业务合并到函数内部。
-- 在按钮事件或定时器中按需调用
local result = uart_send(0, {0xAA, 0x55, 0x00, 0x01})
if result ~= 0 then
print("发送失败", result)
end
返回 0 表示发送接口接受数据,不代表对端已经执行。不要在每轮 on_run 中无间隔发送。
| 用途 | 设置 / 发送 | 接收通道 |
|---|---|---|
| 工程通信口 | uart_setup(0, ...) / uart_send(0, ...) |
0 |
| 独立第二口 | uart_setup(3, ...) / uart_send(3, ...) |
3 |
通道 0 是工程通信口,不是硬件日志 UART0。通道 1 是主口别名;通道 2 仅保留第二口发送别名,不支持 uart_setup。新工程统一使用 0 / 3。
-- 放入现有 on_init;115200、8N1
local result = uart_setup(3, 115200, 8, 0, 0)
if result ~= 0 then
print("第二串口初始化失败", result)
end
Lua 的停止位编码为 0=1位、1=2位,校验编码为 0=无、1=奇、2=偶。主口改参会影响工程协议,但不改写工程文件;双口接收各自保存缓冲。
模拟器第二口需在启动前设置 STT_SIM_UART3 为另一个可用 COM,不能与主口重复。函数范围及版本要求见 5.3 串口通信。
| 现象 | 检查项 |
|---|---|
| 串口有数据但画面不变 | 是否开启接收回调、选择工程通信,是否判断通道 0 |
| 偶尔丢数据 | 是否把一次回调误当一整帧,是否处理半帧及多帧 |
| 第二口无数据 | COM 配置、端口占用和运行库支持情况 |
| 脚本持续发送 | 停止相应定时器或业务开关;set_notify 不会停止 uart_send |
回调中可临时打印通道和长度,在串口副屏“运行日志”查看。内置协议也可提供原始接收回调,监听时不要重复发送其应答。