3.标准通讯格式
协议结构如下:
帧头 | 包头数据 | 数据域 | 包校验 | 帧尾 |
---|---|---|---|---|
0xA5(8byte) | (14byte) | (Nbyte) | (2byte) | (1byte) |
以下为协议中各项数据的说明:
- 帧头由 8 个字节的0xA5组成,帧尾由一个字节的0x5A组成。帧头采用8个帧头,是为了防止0xA5丢失导致数据接收错误。在接收数据时,只要接收到一个0xA5就可认为接收到了帧头,然后等待下一个不是0xA5的数据,该数据为该帧的第一个有效数据。
- 包头数据包含本包数据的一些属性,其定义参考包头数据格式定义(第四章)。
- 数据域为用户协议层数据,参考数据域定义(第五章)。
- 包校验为包头数据和数据域的校验值(CRC16 校验算法参考附录)。
3.1协议的分层
协议采用分层模式,分为协议层和物理传输层两层,其中数据域属于协议层数据。物理传输层又分为PHY0和PHY1两层,其中PHY1层数据结构如下:
包头数据 | 数据域 | 包校验 |
---|---|---|
14byte | Nbyte | 2byte |
PHY1 层实现数据域的封包操作,它为数据域增加包头,并计算包数据的校验值。
帧头 | PHY1层数据 | 帧尾 |
---|---|---|
8byte | Nbyte | 1byte |
PHY0层为PHY1层数据增加帧头和帧尾,并对PHY1层数据进行转义(参考字符转义)。
3.2数据流向
在发送端,协议层数据先提交到 PHY1 层,对数据域进行封包操作。然后 PHY1 层报数据提交到PHY0层,对PHY1层数据进行字符转义并增加帧头帧尾,最后数据经过物理底层发送出去。
在接收端,控制器将物理底层接收到的数据发送到PHY0层,PHY0层去除帧头帧尾,并对数据进行反转义,然后将数据提交到PHY1层。PHY1层将判断包数据的正确性,并去除包头和包校验值,向协议层提交有用数据。
3.3字符转义
- 封帧中遇到0xA5,则将之转义为0xA6,0x02,遇到0xA6,则将之转义为0xA6,0x01。
- 封帧中遇到 0x5A,则将之转义为0x5B,0x02,如遇到0x5B,则将之转义为0x5B,0x01。
- 解帧过程如果遇到连续两个字节为0xA6,0x02,则反转义为 0xA5。
- 解帧过程如果遇到连续两个字节为0xA6,0x01,则反转义为 0xA6。
- 解帧过程如果遇到连续两个字节为0x5B,0x02,则反转义为 0x5A。
- 解帧过程如果遇到连续两个字节为0x5B,0x01,则反转义为 0x5B。
注意:封帧过程中,所涉及校验的数据皆是转义之前的数据,所涉及的数据长度皆是转义之前的数据长度。