@john-lee
2021-01-06T11:12:26.000000Z
字数 961
阅读 1035
串口
控制字
在通信协议中,将使用到以下的控制字,所有控制字都是 1 个字节大小:
控制字 | 值 | 意义 |
---|---|---|
STX |
0x02 | 报文开始 |
ETX |
0x03 | 报文结束 |
ACK |
0x06 | ACK |
DLE |
0x10 | 转义字符 |
NAK |
0x15 | 检测连接状态时使用 |
帧格式
STX |
数据 | ETX |
BCC |
---|
BCC
:用于校验数据是否正确,其值为“数据”字段在封装前或解封后的所有字节异或值。转义
在原始数据所有字节中,凡是出现控制字的字节,在该字节前加入 DLE 转义控制字。例如有以下的数据片段:
0x1B, 0x2A, 0x02, 0x3C, 0x06, 0x10, 0x20
转义后的数据如下:
0x1B, 0x2A, 0x10, 0x02, 0x3C, 0x10, 0x06, 0x10, 0x10, 0x20
^ ^ ^
其中 ^ 指向的字节为插入的转义控制字。
去转义
扫描数据,当出现转义控制字时,删除转义控制字并检查其后的字节是否为控制字,如果是则继续扫描下一字节,否则认为数据是非法的,返回失败,当出现ETX
控制字时,返回成功,当出现STX
,ACK
,NAK
控制字时,返回失败。详细逻辑参考以下流程图:
例如有以下的数据片段:
0x1B, 0x2A, 0x10, 0x02, 0x3C, 0x10, 0x06, 0x10, 0x10, 0x20
^ ^ ^
其中 ^ 指向的字节为需要删除的转义控制字。
去转义后的数据如下:
0x1B, 0x2A, 0x02, 0x3C, 0x06, 0x10, 0x20
封装过程
一段需要封装的数据,先计算其BCC
,再对其进行“转义”,然后在转义后的数据前加STX
,后加ETX
和BCC
。
解封过程
一段需要解封的数据,查找STX
,然后对数据进行“去转义”并计算BCC
,再检查BCC
,如果发现任何失败,需要从STX
的下一个字节位置重复进行解封过程。参考以下的流程图: