实现设备
广州大彩HMI屏幕
任务介绍
基于的底层协议UART,我们设计其上一层,和modbus处于同一层,可以参考modbus的设计自定义我们自己的通信协议。
可以实现一对多通信。
可扩展网线转rs485通信。
协议设计
通信参数
字节序:大端
字符编码格式:GB CODE(gb2312)
串口波特率:19200
广播站号: 0x00
默认站号:0x01
帧最大长度:270个字节
帧间隔:50ms,图片传输推荐500ms
最大传输长度:1024个字节
发送内容:16进制HEX值,非字符串
屏幕大小 320 x 240
协议格式
字段 | 帧头 | 站号 | 数据长度 | 命令序列号 | 功能码 | 访问地址 | 数据 | CRC校验 | 帧尾 |
---|---|---|---|---|---|---|---|---|---|
索引 | [1] | [2] | [3,4] | [5,6] | [7,8] | [9,10] | [11,n] | [n+1,n+2] | [-2,-1] |
大小(字节) | 1 | 1 | 2 | 2 | 2 | 2 | n | 2 | 2 |
举例 | 0xFA | 0x00 | 0x0007 | 0x0001 | 0x0001 | 0x1001 | 0xFCFF | ||
说明 | 起始标志 | 设备站号 | |||||||
STATION_ID | 命令序号到数据 | 命令序列号 | 指明操作 | 指明操作地址LW寄存器地址 | 可变长度 | crc16 校验 | |||
从帧头到数据 | 结束标志 |
功能定义:
此描述只是简要的核心说明,具体示例参考测试用例
功能码 | 功能 | 备注 |
---|---|---|
0x0000 | 读取站号 | 无数据段 响应帧 5A {STATION_ID} 00 FC FF |
0x0001 | 设置站号 | 1个字节 需要初始化 |
0x0100 | 传输图片 | 数据字段前两个字节代表图片序列号。数据段最大长度256【序列号+数据】从00 00开始 |
0x0101 | 显示图片 | 1+2+2个字节:<是否显示,x坐标,y坐标> ,需要旋转270°,坐标是原始竖屏坐标 |
0x0200 | 设置文字 | GB 2312编码,结尾需要添加一个字节 0x00 |
0x0300 | 设置数字 | 1个字节 范围 [0,255] 过长请设置文字 |
0x0400 | 设置状态 | 1个字节 |
响应帧
帧头 + 站号 + 命令序号+ 功能码 + 状态码 + CRC校验+ 帧尾
状态码 | 描述 | 完整帧 |
---|---|---|
FFFF | 成功 | FA {STATION_ID} + 命令序号+ 功能码 + FFFF + {CRC校验} + FCFF |
0000 | 失败 | FA {STATION_ID} + 命令序号+ 功能码 + 0000 + {CRC校验} + FCFF |
0001 | crc校验失败 | FA {STATION_ID} + 命令序号+ 功能码 + 0001 + {CRC校验} + FCFF |
0002 | 功能执行失败 | FA {STATION_ID} + 命令序号+ 功能码 + 0002 + {CRC校验} + FCFF |
0003 | 数据段不足 | FA {STATION_ID} + 命令序号+ 功能码 + 0003 + {CRC校验} + FCFF |
0004 | 帧不完整或太长 | |
或帧尾不对 | FA {STATION_ID} + 命令序号+ 功能码 + 0004 + {CRC校验} + FCFF |
其他情况无响应
定义地址
1.界面地址:
地址说明:
地址 | 功能码 | 说明 |
---|---|---|
1100 | 0200 | 灯位编号:例.01-011(文字传输) |
1200 | 0400 | 矿灯状态:已充满/充电中/已取走(状态1/2/3)(状态传输) |
1300 | 0400 | 矿灯信息:Ⅰ型/Ⅱ型Ⅲ型/Ⅳ型Ⅴ型(状态1/2/3/4/5)(状态传输) |
1400 | 0400 | 警示:工作正常/工作异常(状态1/2)(状态传输) |
2500 | 0200 | 使用人的姓名(文字传输) |
1600 | 0200 | 部门(文字传输) |
1700 | 0200 | 工种(文字传输) |
1800 | 0200 | 血型(文字传输) |
无 | 0100 | 图片传输,不需要指明地址 |
无 | 0101 | 图片显示 |
执行流程图
release版本
devlop版本
CRC16校验
-- 传入的buffer包含帧头到数据
-- CRC16算法
function calculateCRC16(buffer)
local crc = 0xFFFF -- 初始值
local POLY_REVERSE = 0xA001
for i = 1, #buffer do
crc = crc ~ buffer[i]
for _ = 1, 8 do
if (crc & 0x0001) then
crc = (crc >> 1) ~ POLY_REVERSE
else
crc = crc >> 1
end
end
end
return crc & 0xFFFF
end