[关闭]
@john-lee 2021-01-06T11:12:26.000000Z 字数 961 阅读 1035

Wise串口协议

串口


  1. 通信参数:
    • 波特率:9600
    • 数据位:8
    • 校验:无
    • 停止位:1
  2. 控制字
    在通信协议中,将使用到以下的控制字,所有控制字都是 1 个字节大小:

    控制字 意义
    STX 0x02 报文开始
    ETX 0x03 报文结束
    ACK 0x06 ACK
    DLE 0x10 转义字符
    NAK 0x15 检测连接状态时使用
  3. 帧格式

    STX 数据 ETX BCC
    • BCC:用于校验数据是否正确,其值为“数据”字段在封装前或解封后的所有字节异或值。
  4. 转义
    在原始数据所有字节中,凡是出现控制字的字节,在该字节前加入 DLE 转义控制字。例如有以下的数据片段:

    0x1B, 0x2A, 0x02, 0x3C, 0x06, 0x10, 0x20
    

    转义后的数据如下:

    0x1B, 0x2A, 0x10, 0x02, 0x3C, 0x10, 0x06, 0x10, 0x10, 0x20
                ^                 ^           ^
    

    其中 ^ 指向的字节为插入的转义控制字。

  5. 去转义
    扫描数据,当出现转义控制字时,删除转义控制字并检查其后的字节是否为控制字,如果是则继续扫描下一字节,否则认为数据是非法的,返回失败,当出现ETX控制字时,返回成功,当出现STXACKNAK控制字时,返回失败。详细逻辑参考以下流程图:

    Created with Raphaël 2.1.2开始取下一个字节字节是ETX?返回成功字节是DLE?取下一个字节字节是控制字?保存字节返回失败字节是STX, ACK,NAK?yesnoyesnoyesnoyesno

    例如有以下的数据片段:

    0x1B, 0x2A, 0x10, 0x02, 0x3C, 0x10, 0x06, 0x10, 0x10, 0x20
                ^                 ^           ^
    

    其中 ^ 指向的字节为需要删除的转义控制字。
    去转义后的数据如下:

    0x1B, 0x2A, 0x02, 0x3C, 0x06, 0x10, 0x20
    
  6. 封装过程
    一段需要封装的数据,先计算其BCC,再对其进行“转义”,然后在转义后的数据前加STX,后加ETXBCC

  7. 解封过程
    一段需要解封的数据,查找STX,然后对数据进行“去转义”并计算BCC,再检查BCC,如果发现任何失败,需要从STX的下一个字节位置重复进行解封过程。参考以下的流程图:

    Created with Raphaël 2.1.2开始置pos为数据起始地址从pos开始查找STX找到?置pos为STX的下一个字节地址去转义,成功?计算BCCBCC正确?返回成功.返回失败yesnoyesnoyesno
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注