1.1 二进制流接口格式
指令 | 平面化表示与结构化表示的对应关系 | ||
字节 | 参数 | 数值 | 说明 |
1 | m_iHeader | 0XAA | 报文的同步字节,用于检测报文的起始位置,常量0XAA |
2 | m_iOpCode | 该报文的命令字,取值范围 0X00-0XFF | |
3 | m_iValueA | 报文命令字的**个参数,具体意义取决于m_iOpCode | |
4 | m_iValueB | 报文命令字的第二个参数,具体意义取决于m_iOpCode | |
5 | m_iValueC | 报文命令字的第三个参数,具体意义取决于m_iOpCode | |
6 | m_iValueD | 报文命令字的第四个参数,具体意义取决与m_iOpCode | |
7 | m_iAmount | 扩展部分的数据报文m_pBuffer的长度,取值范围0X00-0XF5 | |
8 | m_iCRCode.MSB | 0X## | 整个报文的16位CRC校验和的高字节 |
9 | m_iCRCode.LSB | 0X## | 整个报文的16位CRC校验和的低字节 |
10 | m_pBuffer | 扩展部分的数据报文,最多可容纳245(0XF5)个字节 | |
备注-1 | CRC计算从**个字节开始m_iHeader,至m_pBuffer的最后一个字节结束;计算之前需要将CRC高低字节全部清零,然后将计算结果写到 CRC 的位置,保持高字节在前,低字节在后 | ||
备注-2 | 请求命令的应答命令,其命令字 = 请求命令 + 0X80 | ||
备注-3 | 报文的同步字节 m_iHeader 是一个固定的常数,取值 0XAA | ||
备注-4 | 如果命令没有用到参数,默认将参数 m_iValueA,m_iValueB, m_iValueC, m_iValueD 填写为0X00 | ||
备注-5 | 如果命令没有扩展部分,则m_pBuffer 区域不要填写,同时将 m_iAmount 字段填写为 0X00 | ||
示例-1 | 请求命令:AA 26 00 00 00 00 01 F8 24 01 应答命令:AA A6 00 00 00 00 02 F3 BB 01 00 |
1.2 二进制流接口 CRC计算方式
多项式:f(X)=1+X2+X15+X16,该多项式和工业标准的Modbus-RTU完全一样
发送端CRC计算:先把m_iCRCode位置清零,然后计算整个报文(从**个字节m_iHeader开始至m_pBuffer的最后一个字节结束)的CRC数据,注意高字节在前(MSB)
接收端CRC验算:首先从报文中读取CRC,然后将报文的m_iCRCode清零,计算出整个报文(同上)的CRC,比较这两个CRC验证报文的正确性。
应答命令字:请求命令字 + 0X80
CRC算法:工业标准CRC-16、CRC-32,请参考:“CRC-16查表算法”和“CRC-32查表算法”。
CRC的计算可以借助如下的工具软件—WiMi-net无线自组网管理平台
WiMi-net无线自组网管理平台软件有两种显示模式,上图中红色框住的部分是结构化显示模式,绿色部分是平面显示的模式。为了测试指令是否正确,可以将平面化的指令复制出来,在串口调试助手中进行测试,看看是否有回应。如果可以收到应答,那么说明CRC的计算是正确的。
采用串口助手测试的时候,切记要正确设置数据的格式:
发送需要采用十六进制(勾选“HEX发送”)
接收显示需要采用十六进制(勾选“HEX显示”)
1.3 名词术语和缩写简记符
MSB:Most Significant Byte,双字节变量的高字节 ,即B8-B15
LSB:Least Significant Byte,双字节变量的低字节,即B0-B7
Addr:无线节点的16位网络地址
MAC:无线节点的64位MAC地址
1.4 32位系统上的编程注意事项
如果采用C语言的结构体访问内存数据,需要调整到单字节边界(默认为4字节边界)
系统的多字节变量默认是Big-Endian,也就是大端在前,ARM和X86都是Little-Endian,需要进行字节顺序转换
CRC-16的计算多项式和Modbus完全一样,但是其位置不一样,作用范围也不一样
CRC-16在计算之前需要采用默认的数值0X00作为填充。
1.5 关于缺省参数和配置
WiMi-net基于自组网技术设计,所有的站点,包括主站,从站,和中继,都有默认的出厂配置参数,通常情况下无需人工配置
从站和中继的网络(PAN)标示可以通过对码的方式予以获取
从站和中继节点的工作频带,信道,网络路径,时槽等参数会通过自组网机制自动获取,不需要用户配置