此协议适用于无线测控系统中主站与分站之前的数据传输协议,如下图所示的绿色部分的通信。
协议规定
1. 当分站收到主站的数据请求时,必须要在1秒以内作出响应。
2. 该协议是通过包传输的,串口是以3.5T无数据为包结束条件,例如在串口波特率1200bp/s下,传输3.5个数据所需的时间大约为30ms(即3.5T为30ms),收到一个数据开始计时,如果收到这个数据后30ms内没有再收到下一个数据,则认为此包结束,这个数据就是这个包的最后一个数据,之前所收到的所有数据就是这包的内容。
3. 协议采用CRC-16校验(生产多项式x16+x15+ x2+1,简记式为8005),校验失败后这包丢弃不做协议解析。
4. 超时重发机制由主站完成,分站无此机制。
5. 传输的字节序采用“little endian”方式,即我们通常所说的小端朝前(Intel的x86系列CPU结构),这意味着当发射多个字节时,首先发送最低有效位。例要发送一个整形数据(两个字节)内容为0x1234,就先发送的低字节为0x34, 然后再0x12,同理浮点型的四个数据也是如此发送。协议中所有的数据都是采用这种字节序。
每个通信的数据包都有捷麦标示头、通信头和请求或响应内容三部分组成,如下图所示:
捷麦标示头有两种协议头,普通采集与响应类型和分站主动上传这两种类型,无论哪种类型,捷麦标示头固定为6个字节。具体内容如下:
普通采集与响应的标示头为:4F 3F 2F 1F 5F 6F
通信头的数据长度是固定的,一共是18格字节,包含的内容如下图所示:
标示此包数据是哪个设备或者应用的,固定为两个字节。
例如P5037设备的设备号为 10 01,站点测试应用的应用号为 00 05。
包标示从0开始,请求和响应的包标示相同。新包在原有包标示的基础上加1。重发时包标示不变(主站对包标示进行加1操作,分站响应时,包标示不做任何处理)。占两个字节
包长的实际数值是请求或响应的数据的字节数量,也就是上面协议整体组成示意图中的蓝色部分的字节数量,占两个字节(字节序低字节在前)。
类型码 | 定义 | 方向 | 备注 |
00H | 请求 | 主站→分站 | 对分站点的CPU模块 |
80H | 应答 | 分站→主站 | |
02H | 请求 | 主站→分站 | 对分站点的通信管理模块的存储器 |
82H | 有存储内容应答 | 分站→主站 | 当无存储内容时包长为0,无绿色部分 |
84H | 主动上传 | 分站→主站 | |
04H | 主动上传的响应 | 主站→分站 | |
05H | 主动上传的响应并接下来有请求 | 主站→分站 |
路径占三个字节,表示这包数据的传输路径,用于电台在中继时的协议支持。缺省值(不使用中继)为 EF FF F0 。
24位(三个字节)的路径信息中前2个字节表示数据的路径信息。每一级路径用4位二进制表示。这4位表示在这一级上中转站的编号。如果这个站是中转站其编号范围是0―D。共可表达4级树形路径。第三个字节的后4位表示数据传递的当前路径级数。用F表示对应的字段无内容。用E表示树形结构的终点。数据的结构如下:
备用占两个字节,用于协议扩展,缺省值为0x00 0x00。
目的地址表示数据包的目的。源地址表示数据的来源。每个请求数据中的请求对应着响应数据中的一个响应。请求和响应是成对出现的。
在一个系统中,每一个分站和主站都有唯一的地址。
地址用两个字节表示,字节序采用低字节在前,比如一个分站的地址为12,那么地址表示为:0C 00。
通信头部分的CRC校验,也就是灰色部分的数据CRC,不包含“捷麦标示头”部分和“请求或响应数据”部分。
该协议一包可以获取不同数据类型的数据,获取的这一小段称为数据段,请求和响应的协议格式如下图所示:
注意请求内容或者响应内荣包中的“内容”字段的长度依据功能码等,可能有些功能码没有“内容”字段。
请求(响应)总个数:表示数据段的总个数,段数的最大值为20,请求和响应是一一对应。
数据段:每一个数据段都是由序号、功能码、地址偏移、寄存器数和内容构成。序号是从1依次增加的,功能码等参加下文。
内容校验:内容CRC是指对包内容(请求或者响应内容)做CRC处理,不包含“捷麦标示头”部分和“通信头”部分。
功能码定义汇总
数据类型 | 名称 | 功能码意义 | 功能码(HEX) | 主->主 | |
数据访问 | 1位访问 | 物理离散输入 | 读离散输入 | 02 | 42/82 |
物理继电器 | 读离散输出 | 01 | 41/81 | ||
写离散输出 | 0F | 4F/8F | |||
8位访问 | 单字节寄存器 | 读字节输入寄存器 | 33 | 73/B3 | |
读字节输出寄存器 | 34 | 74/B4 | |||
写字节输出寄存器 | 35 | 75/B5 | |||
16位访问 | 整形寄存器 | 读整形输入寄存器 | 04 | 44/84 | |
读整形输出寄存器 | 03 | 43/83 | |||
写整形输出寄存器 | 10 | 50/90 | |||
32位访问 | 实数寄存器 | 读实数输入寄存器 | 36 | 76/B6 | |
读实数输出寄存器 | 37 | 77/B7 | |||
写实数输出寄存器 | 38 | 78/B8 |
01功能代码是远程设备用来读取离散输出的1~2000邻近状态。请求协议数据单元详细说明了离散输出的起始地址和离散输出的个数。离散输出的地址从0开始。
响应信息中的离散输出被按字节打包,数据字节的每一位都有一个离散输出与之相对应。状态1=ON,0=OFF。起始地址的内容被放入数据第一字节的最低有效位,依次类推。
如果返回输出的位数不是8的倍数,剩余高位用0补。计数字节详细记录了完整数据字节的数量。
请求协议数据单元
功能代码 | 1字节 | 0x01 |
起始地址 | 2字节 | 0x0000到0xFFFF |
感应器数量 | 2字节 | 1到2000(0x7D0) |
响应协议数据单元
功能代码 | 1字节 | 0x01 |
起始地址 | 2字节 | 0x0000到0xFFFF |
感应器数量 | 2字节 | 1到2000(0x7D0) |
感应器状态 | n字节 | n=N或者N+1 |
N*=输出量/8,如果剩余量不为0,则N=N+1
下面举一个例子是关于请求读离散输出(20-38):
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 起始地址低位 起始地址高位 输出位数的低位 输出位数的高位
| 01 | 功能 起始地址低位 起始地址高位 输出位数的低位 输出位数的高位 27-20的输出状态 35-28的输出状态 38-36的输出状态 | 01 |
13 | 13 | ||
00 | 00 | ||
13 | 13 | ||
00 | 00 | ||
CD | |||
6B | |||
05 |
十六进制数CD或二进制数1100 1101包含了输出位27的状态“1”。输出位27是这个字节的最高位,输出位20为这个字节的最地位。
在通常的情况下,一个字节的左边是最高有效位,右边是最低有效位。这样输出的第一个字节从左边到右边依次是位27到20,下一个字节从左到右依次是位35到28。当传输这些输出状态时,从最低有效位到最高有效位:20…27,28…35依次类推。
在最后一个字节,十六进制数05或二进制数0000 0101是输出位38-36的状态。输出位38是从左边开始数的第六位,输出位36是这个字节的最低位。剩余的五个高位用0补。
注意:剩余的五个位(高位)用0补。
功能代码是远程安装设备驱动程序用来读取离散输入的1~2000个邻近状态。请求PDU详细说明了离散输入的起始地址,第一个离散输入的地址域和离散输入的个数。离散输入的地址从0开始,因此,离散输入感应器1-16的地址为0-15。
响应信息中的离散输入被按字节打包,数据字节的每一位都有一个离散输入与之相对应。状态1=ON,0=OFF。起始地址的内容被放入数据第一字节的最低有效位,依次类推。
如果返回输出的位数不是8的倍数,剩余高位用0补。计数字节详细记录了完整数据字节的数量。
请求协议数据单元
功能代码 | 1字节 | 0x02 |
起始地址 | 2字节 | 0x0000到0xFFFF |
输入量 | 2字节 | 1到2000(0x7D0) |
响应协议数据单元
功能代码 | 1字节 | 0x02 |
起始地址 | 2字节 | 0x0000到0xFFFF |
输入量 | 2字节 | 1到2000(0x7D0) |
感应器状态 | N*×1字节 |
N*=输出量/8,如果剩余量不为0,则N=N+1
下面举一个例子是关于请求读离散输入(197-218):
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 起始地址低位 起始地址高位 输入位数的低位 输入位数的高位
| 02 | 功能 起始地址高位 起始地址低位 输入位数的高位 输入位数的低位204-197的输入状态 212-205的输入状态 218-213的输入状态 | 02 |
C4 | C4 | ||
00 | 00 | ||
16 | 16 | ||
00 | 00 | ||
AC | |||
DB | |||
35 |
从十六进制数AC或二进制数1010 1100中可以读出离散输入204-197的状态,输入位204是这个字节最高位,197是这个字节的最低位。
从十六进制数35或二进制数0011 0101中可以读出离散输入204-197的状态,输入位218是字节从左边数的第三位,输入位213是这个字节的最低位
注意:剩余的两位(高位)用0补
这个功能代码是远程设备用来确定离散输出序列中的离散输出的ON或OFF状态。请求协议数据单元详细说明了离散输出的起始地址和输出数量。离散输出的地址是从0开始的,因此离散输出1的地址为0。
在请求协议数据单元详细说明了请求状态ON或OFF。这个区域的相应位为逻辑“1”时,对应的输出为ON,逻辑“0”对应OFF。
正常的响应返回功能代码,起始地址和对应离散输出的数量。
请求协议数据单元
功能代码 | 1字节 | 0FH |
起始地址 | 2字节 | 0000H到007FH |
输出数量 | 2字节 | 0001H到0080H |
输出值 | N*×1字节 |
N*=输出量/8,如果剩余量不为0,则N=N+1
响应协议数据单元
功能代码 | 1字节 | 0FH |
起始地址 | 2字节 | 0000H到007FH |
输出数量 | 2字节 | 0001H到0080H |
下面举一个例子,写一连串的10个离散输出,从离散输出20开始
被传输的数据的第一字节CD是存储器码为27-20的状态,最低位表达的是离散输出20的状态,下一字节存储器码为29-28的状态,最低位表达的是离散输出28的状态。在最后一字节没有用到的位用0补。
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 起始地址低位 起始地址高位 输出数量低位 输出数量高位 27-20的状态 29-28的状态 | 0F | 功能 起始地址低位 起始地址高位 输出数量低位 输出数量高位
| 0F |
13 | 13 | ||
00 | 00 | ||
0A | 0A | ||
00 | 00 | ||
CD | |||
01 |
这个功能代码是用来读远程设备相邻的字节输入寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为一个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。
请求协议数据单元
功能代码 | 1字节 | 33H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
响应协议数据单元
功能代码 | 1字节 | 33H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
数据 | N*字节 |
N*=数据字节个数
下面这个例子是读从字节寄存器2开始读内容为00 0A 01 02到寄存器,:
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 | 33 | 功能 | 33 |
起始地址低位 | 01 | 起始地址低位 | 01 |
起始地址高位 | 00 | 起始地址高位 | 00 |
数据字节低位 | 04 | 数据字节低位 | 04 |
数据字节高位 | 00 | 数据字节高位 | 00 |
数据值VB00001 数据值VB00002 数据值VB00003 数据值VB00004 | 00 0A 01 02 |
这个功能代码是用来读远程设备相邻的字节输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为一个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。
请求协议数据单元
功能代码 | 1字节 | 34H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
响应协议数据单元
功能代码 | 1字节 | 34H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
数据 | N*字节 |
N*=数据字节个数
下面这个例子是读从字节寄存器2开始读内容为00 0A 01 02到寄存器,:
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 | 34 | 功能 | 34 |
起始地址低位 | 01 | 起始地址低位 | 01 |
起始地址高位 | 00 | 起始地址高位 | 00 |
数据字节低位 | 04 | 数据字节低位 | 04 |
数据字节高位 | 00 | 数据字节高位 | 00 |
数据值VB00001 数据值VB00002 数据值VB00003 数据值VB00004 | 00 0A 01 02 |
这个功能代码是远程设备用来写相邻的字节输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和输出数量。每个寄存器为一个字节。正常的的响应会返回功能代码,起始地址和写入的寄存器的数量。
请求协议数据单元
功能代码 | 1字节 | 35H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | |
数据 | N*字节 |
N*=数据字节个数
响应协议数据单元
功能代码 | 1字节 | 35H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
下面这个例子是写00 0A 01 02到寄存器,从字节寄存器2开始:
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 | 35 | 功能 | 35 |
起始地址低位 | 01 | 起始地址低位 | 01 |
起始地址高位 | 00 | 起始地址高位 | 00 |
数据字节低位 | 04 | 数据字节低位 | 04 |
数据字节高位 | 00 | 数据字节高位 | 00 |
数据值VB00001 | 00 | ||
数据值VB00002 | 0A | ||
数据值VB00003 | 01 | ||
数据值VB00004 | 02 |
这个功能代码是用来读远程设备相邻的整形(int双字节)输入寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为两个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。
请求协议数据单元
功能代码 | 1字节 | 04H |
起始地址 | 2字节 | 0000H到13FFH |
寄存器个数 | 2字节 | 1到400(0001-190H) |
响应协议数据单元
功能代码 | 1字节 | 04H |
起始地址 | 2字节 | 0000H到13FFH |
寄存器个数 | 2字节 | 1到400(0001-190H) |
数据 | N*字节 |
N*=数据字节个数*2
下面这个例子是读从整形寄存器2开始读内容为00 0A和01 02到寄存器,:
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 | 04 | 功能 | 04 |
起始地址低位 | 01 | 起始地址低位 | 01 |
起始地址高位 | 00 | 起始地址高位 | 00 |
寄存器个数低位 | 02 | 寄存器个数低位 | 02 |
寄存器个数高位 | 00 | 寄存器个数高位 | 00 |
数据值ViD2低字节 数据值VID2高字节 数据值VID3低字节 数据值VID3高字节 | 00 0A 01 02 |
这个功能代码是用来读远程设备相邻的整形(int双字节)输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为两个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。
请求协议数据单元
功能代码 | 1字节 | 03H |
起始地址 | 2字节 | 0000H到13FFH |
寄存器个数 | 2字节 | 1到400(0001-190H) |
响应协议数据单元
功能代码 | 1字节 | 03H |
起始地址 | 2字节 | 0000H到13FFH |
寄存器个数 | 2字节 | 1到400(0001-190H) |
数据 | N*字节 |
N*=数据字节个数*2
下面这个例子是读从整形输出寄存器2开始读内容为00 0A和01 02到寄存器,:
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 | 03 | 功能 | 03 |
起始地址低位 | 01 | 起始地址低位 | 01 |
起始地址高位 | 00 | 起始地址高位 | 00 |
寄存器个数低位 | 02 | 寄存器个数低位 | 02 |
寄存器个数高位 | 00 | 寄存器个数高位 | 00 |
数据值VOD2低字节 数据值VOD2高字节 数据值VOD3低字节 数据值VOD3高字节 | 00 0A 01 02 |
这个功能代码是用来写远程设备相邻的整形(int双字节)输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为两个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。
请求协议数据单元
功能代码 | 1字节 | 10H |
起始地址 | 2字节 | 0000H到13FFH |
寄存器个数 | 2字节 | 1到400(0001-190H) |
数据 | N*字节 |
N*=数据字节个数*2
响应协议数据单元
功能代码 | 1字节 | 10H |
起始地址 | 2字节 | 0000H到13FFH |
寄存器个数 | 2字节 | 1到400(0001-190H) |
下面这个例子是读从整形输出寄存器2开始读内容为00 0A和01 02到寄存器:
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 | 10 | 功能 | 10 |
起始地址低位 | 01 | 起始地址低位 | 01 |
起始地址高位 | 00 | 起始地址高位 | 00 |
寄存器个数低位 | 02 | 寄存器个数低位 | 02 |
寄存器个数高位 | 00 | 寄存器个数高位 | 00 |
数据值VOD2低字节 数据值VOD2高字节 数据值VOD3低字节 数据值VOD3高字节 | 00 0A 01 02 |
这个功能代码是用来读远程设备相邻实数(float,四字节,IEE754标准)输入寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为四个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。
请求协议数据单元
功能代码 | 1字节 | 36H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
响应协议数据单元
功能代码 | 1字节 | 36H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
数据 | N*字节 |
N*=数据字节个数*4
下面这个例子是读从整形寄存器2开始读内容为3.14和3.15到寄存器,:
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 | 36 | 功能 | 36 |
起始地址低位 | 01 | 起始地址低位 | 01 |
起始地址高位 | 00 | 起始地址高位 | 00 |
寄存器个数低位 | 02 | 寄存器个数低位 | 02 |
寄存器个数高位 | 00 | 寄存器个数高位 | 00 |
数据值ViF2字节1 数据值ViF2字节2 数据值ViF2字节3 数据值ViF2字节4 数据值ViF3字节1 数据值ViF3字节2 数据值ViF3字节3 数据值ViF3字节4 | C3 F5 48 40 9A 99 49 40 |
这个功能代码是用来读远程设备相邻实数(float,四字节,IEE754标准)输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为四个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。
请求协议数据单元
功能代码 | 1字节 | 37H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
响应协议数据单元
功能代码 | 1字节 | 37H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
数据 | N*字节 |
N*=数据字节个数*4
下面这个例子是读从整形寄存器2开始读内容为3.14和3.15到寄存器,:
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 | 37 | 功能 | 37 |
起始地址低位 | 01 | 起始地址低位 | 01 |
起始地址高位 | 00 | 起始地址高位 | 00 |
寄存器个数低位 | 02 | 寄存器个数低位 | 02 |
寄存器个数高位 | 00 | 寄存器个数高位 | 00 |
数据值VOF2字节1 数据值VOF2字节2 数据值VOF2字节3 数据值VOF2字节4 数据值VOF3字节1 数据值VOF3字节2 数据值VOF3字节3 数据值VOF3字节4 | C3 F5 48 40 9A 99 49 40 |
这个功能代码是用来写远程设备相邻实数(float,四字节,IEE754标准)输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和写的数量和内容。每个寄存器为四个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。
请求协议数据单元
功能代码 | 1字节 | 38H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
数据 | N*字节 |
N*=数据字节个数*4
响应协议数据单元
功能代码 | 1字节 | 38H |
起始地址 | 2字节 | 0000H到13FFH |
数据字节个数 | 2字节 | 1到400(0001-190H) |
N*=数据字节个数*4
下面这个例子是写从整形寄存器2开始内容为3.14和3.15到寄存器上,:
请求 | 响应 | ||
字段名称 | (Hex) | 字段名称 | (Hex) |
功能 | 38 | 功能 | 38 |
起始地址低位 | 01 | 起始地址低位 | 01 |
起始地址高位 | 00 | 起始地址高位 | 00 |
寄存器个数低位 | 02 | 寄存器个数低位 | 02 |
寄存器个数高位 | 00 | 寄存器个数高位 | 00 |
数据值VOF2字节1 数据值VOF2字节2 数据值VOF2字节3 数据值VOF2字节4 数据值VOF3字节1 数据值VOF3字节2 数据值VOF3字节3 数据值VOF3字节4 | C3 F5 48 40 9A 99 49 40 |
各种类型码还有两个码+0x40和0x80的类型码(例如0x01码变成0x41和0x81,0x0F变成0x4F和0x8F),他们的语法是一样处理的。只有一下不同:
当发送出去的数据包是0x40码类型时,捷麦标示头自动变成4F 3F 2F 1F 5F 5F的主动上传标示头,包类型字段变成84的主动上传字段。(其他的处理逻辑跟普通的下至数据一样处理)。
当收到的数据包类型是这种0x40码类型时,将数据内容解析出来,然后将内容更新到自身对应的0x80码类型的变量上,然后进行相应的响应,(标示头自动变成主动上传头,包类型字段变成04的主动上传响应字段)(其他的处理逻辑跟普通的采集数据包响应一样处理)。
0x80码是采集变量(只读变量),采集周期为0。
(假设分配的设备号为25 7D,包标示为5,中心站的地址为0,请求的分站为7,获得整形输入的数据)
主站完整的数据请求包为:
4F 3F 2F 1F 5F 6F 25 7D 05 00 09 00 00 EF FF F0 00 00 07 00 00 00 F6 08 01 01 04 00 00 02 00 FA B1
从站完整的数据响应包为:
4F 3F 2F 1F 5F 6F 25 7D 05 00 0D 00 80 EF FF F0 00 00 00 00 07 00 03 6B 01 01 04 13 00 02 00 12 34 56 78 1B CB
(假设分配的设备号为25 7D,包标示为5,中心站的地址为0,分站为7,获得整形输入的数据和读离散输出)
主站完整的数据请求包为:
4F 3F 2F 1F 5F 6F 25 7D 05 00 0F 00 00 EF FF F0 00 00 07 00 00 00 FE 00 02 01 04 00 00 02 00 02 01 00 00 09 00 57 F1
从站完整的数据响应包为:
4F 3F 2F 1F 5F 6F 25 7D 05 00 15 00 80 EF FF F0 00 00 00 00 07 00 21 7B 02 01 04 00 00 02 00 12 34 56 78 02 01 00 00 09 00 D7 01 72 82