1 、串口通讯参数

波特率:9600(bit/s)
数据位:8位
奇偶校验:无
停止位:1
数据流控:无

2、基本帧格式说明

下标 字段 长度(byte) 说明
00 帧头 2 固定 0xAA 0x55
02 数据长度 N 除去帧头和CRC字段的长度
03 命令 1 功能的命令码CMD
04 目标ID 1 接收端的ID,网关ID为0x15
05 源ID 1 发送端ID,该类型从机的ID
06 从机类型 1 设备类型,面板01,继电器02
07 数据区 data 有效数据
CRC 2 CRC16校验码,异或码0x1021
  1. //函数返回:CRC计算值,无符号整数
  2. //参数poly:异或码取0x1021
  3. //参数data:要计算的数据缓冲区
  4. //参数start:数据缓冲区开始位置
  5. //参数length:要计算的数据缓冲区
  6. unsigned short crc16(unsigned char *data, int start, int length, unsigned short poly)
  7. {
  8. unsigned short crc = 0; // crc 默认取0
  9. while (length-- > 0) // 循环length次
  10. {
  11. unsigned char bt = data[start++]; // 当前字节存于bt
  12. for (int i = 0; i < 8; i++) // 每个字节循环移位8次
  13. {
  14. unsigned char b1 = ((crc & 0x8000) != 0); // 求crc最高第16位是0还是1,结果存b1
  15. unsigned char b2 = ((bt & 0x80) != 0); // 求bt最高第8位是0还是1,结果存b2
  16. if (b1 != b2) // b1 和 b2 相等
  17. crc = (unsigned short)((crc << 1) ^ poly); // crc左移一们之后再和poly异或,结果存crc
  18. else // b1 和 b2 不相等
  19. crc = crc << 1; // crc 左移一位
  20. bt = bt << 1; // bt 左移一位
  21. }
  22. }
  23. return crc;
  24. }

3、具体命令说明

3.1 更新多路继电器状态

CMD:0X09
方向:网关主机—>继电器

下标 字段 长度(byte) 说明
00 帧头 2 固定 0xAA 0x55
02 数据长度 N 除去帧头和CRC字段的长度
03 命令 0x09 功能的命令码CMD
04 目标ID 1 接收端的ID,网关ID为0x15
05 源ID 1 发送端ID,该类型从机的ID
06 从机类型 1 设备类型,面板01,继电器02
07 数据区 data 有效数据
CRC 2 CRC16校验码,异或码0x1021

有效数据data

下标 字段 长度(byte) 说明
07 要改变的回路数 1 要改变的回路总数
08 回路号 1 1,2,3,4
09 开关值 1 1关,2开,其它值无效
0A 回路号 1 1,2,3,4
0B 开关值 1 1关,2开,其它值无效
。。。

应用示例参考
网关ID=0X15,4路ID=0X28

单开1路
AA 55 07 09 28 15 02 01 01 02 AB 08

多开1,3路,2,4不变
AA 55 0D 09 28 15 02 04 01 02 02 FF 03 02 04 FF DB 57

多开2,4路,1,3不变
AA 55 0D 09 28 15 02 04 01 FF 02 02 03 FF 04 02 D4 13

全关1234
AA 55 0D 09 28 15 02 04 01 01 02 01 03 01 04 01 26 28

3.2 主机查询多路继电器状态

CMD:0X0B
方向:网关主机—>继电器

下标 字段 长度(byte) 说明
00 帧头 2 固定 0xAA 0x55
02 数据长度 N 除去帧头和CRC字段的长度
03 命令 0x0B 功能的命令码CMD
04 目标ID 1 接收端的ID,网关ID为0x15
05 源ID 1 发送端ID,该类型从机的ID
06 从机类型 1 设备类型,面板01,继电器02
07 数据区 data 有效数据
CRC 2 CRC16校验码,异或码0x1021

有效数据data

下标 字段 长度(byte) 说明
07 要查询的回路数 1 要查询的回路总数
08 回路号 1 1,2,3,4
09 开关值 1 1关,2开,其它值无效
0A 回路号 1 1,2,3,4
0B 开关值 1 1关,2开,其它值无效
。。。

应用示例参考
网关ID=0X15,4路ID=0X28
查询全部开关状态
AA 55 09 0B 15 F0 02 04 01 02 03 04 C7 35