ApusTFT目前集成集成DCBUS、XGUS、Modbus协议,更多协议请联系客服或厂家。用户根据产品,选择对应协议开发。用户不需要关心屏幕端如何接收或发送指令/报文,只需要将变量地址关联到对应的组态控件即可。屏幕底层会将接收的报文解析后,将数据更新到控件中;同时,操作控件时,会将相应的寄存器的值下发到设备中。

int calculate_crc(uint8_t* data, uint16_t length){
uint16_t crc = 0xFFFF;
for (uint16_t i = 0; i < length; i++) {
crc ^= data[i];
for (uint8_t j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
return crc;
}
| 帧头(2byte) | 站号(1byte) | 长度(1byte) | 功能码(1byte) | 地址(2byte) | 数据(n byte) | 校验(2byte) |
|---|---|---|---|---|---|---|
| 0xAA55 | 0x00~0xFF | 功能码+…+校验 | 0xF1/0xF2 | 0x0000~0xFFFF | ……. | 0xCCCC |
以向 0x1000 变量地址里写数值100为例: AA55 00 07 F1 1000 0064 CCCC
AA55 表示:帧头;
00表示:站号;
07表示:数据长度,功能码+…+校验的总字节长度;
F1表示:写寄存器;
1000表示:变量地址(2 byte);
0064表示:数据 100(2byte);
CCCC表示:预留字段,没有开启CRC;
若屏幕的站号为1: AA55 01 07 F1 1000 0064 CCCC
若屏幕的站号为1、开启CRC :AA55 01 07 F1 1000 0064 7289
屏幕开启应答:AA55 00 03 F1 CCCC
若屏幕的站号为1:AA55 01 03 F1 CCCC
若屏幕的站号为1、开启CRC:AA55 01 03 F1 B0B4
以读 1000 变量地址里的数值(假设当前数值为 100)为例:AA55 00 06 F2 1000 01 CCCC
AA55 表示:帧头;
00表示:站号;
06表示:数据长度;
F2表示:读寄存器;
1000表示:变量起始地址(2 byte);
01表示:读取的地址个数,范围为1~255个(1byte);
CCCC表示:预留字段,没有开启CRC;
屏收到主板的指令,返回读应答指令:AA55 00 08 F2 1000 01 0064 CCCC
AA55 表示:帧头;
00表示:站号;
08表示:数据长度;
F2表示:读寄存器;
1000表示:变量起始地址(2 byte);
01表示:寄存器数据的长度,单位1 word;
0064表示:寄存器值,100
CCCC表示:预留字段,没有开启CRC;
若屏幕的站号为1:
主板请求:AA55 01 06 F2 1000 01 CCCC
屏幕返回:AA55 01 08 F2 1000 01 0064 CCCC
若屏幕的站号为1、开启CRC :
主板请求:AA55 01 06 F2 1000 01 7B77
屏幕返回:AA55 01 08 F2 1000 01 0064 8CFD
若开启 “自动上传”,用户在屏幕上操作控件,修改寄存器值,可自动发出指令上传给主板。
如,点击屏幕将寄存器LW1000修改为100:AA55 0008 F2 1000 01 0064 CCCC
AA55 表示:帧头;
00表示:站号;
08表示:数据长度;
F2表示:读寄存器;
1000表示:变量起始地址(2 byte);
01表示:寄存器数据的长度;
0064表示:寄存器值,100
CCCC表示:预留字段,没有开启CRC;
帧头(2byte) 长度(1byte) 功能码(1byte) 地址(2byte) 数据(n byte) 校验(2byte)
0xAA55 0x00~0xFF 0x80/0x81/0x82/0x83 0x0000~0xFFFF ……. CRC16(x16+x15+x2+x1)
| 帧头(2byte) | 长度(1byte) | 功能码(1byte) | 地址(2byte) | 数据(n byte) | 校验(2byte) |
|---|---|---|---|---|---|
| 0xAA55 | 0x00~0xFF | 0x80/0x81/0x82/0x83 | 0x0000~0xFFFF | ……. | CRC16(x16+x15+x2+x1) |
在工程属性配置,开启XGUS协议,如下所示:
