Ascii控制字符SOH, DLE, STX, ETX:如何在UART上转义二进制数据



我想要一种简单,轻量级的方式,让两个基本的8位mcu通过8位UART连接相互通信,将ASCII字符作为8位值发送,并将二进制数据作为8位值发送。

我不想重新发明轮子,所以我想知道是否有一些ASCII实现可以工作,以某种标准的方式使用ASCII控制字符。

问题是:要么我没有正确理解它,要么它不能做我想要的。

维基百科关于控制字符的页面说数据包可以这样发送:

  1. & lt;DLE> <-数据链转义和航向
  2. 的开始<<li>标题数据/gh>
  3. & lt;DLE> -数据链接转义和文本开始
  4. & lt;有效载荷>
  5. & lt;DLE> <数据链接转义和文本结束>

但是,如果有效负载是包含两个连续字节的二进制数据,相当于DLE和ETX呢?这些字节应该如何转义?

链路可能中断并重新建立,因此接收MCU应该能够开始接收中间数据包,并且有一种简单的方法来告诉下一个数据包何时开始,因此它可以忽略数据,直到该部分数据包结束。

错误检查将在更高的级别发生,以确保接收到的数据包是有效的-除非ASCII标准也可以解决这个问题

由于要将二进制数据与文本消息一起传输,因此必须确保接收方不会将控制字节与有效负载内容混淆。一种方法是对有效负载数据进行编码,以便在输出中不出现任何特殊字符。如果开销不成问题,那么像Base16这样最简单的编码就足够了。否则,您可能会想看看无escape编码,这些编码是专门为从编码数据中删除某些字符而设计的。

我知道这是一个老问题,但我认为我应该建议在RFC 1055中定义的串行线互联网协议(SLIP)。这是一个非常简单的协议

最新更新