Binary Ascii控制字符SOH、DLE、STX、ETX:如何通过UART转义二进制数据?

Binary Ascii控制字符SOH、DLE、STX、ETX:如何通过UART转义二进制数据?,binary,ascii,uart,8-bit,Binary,Ascii,Uart,8 Bit,我想要一种简单、轻量级的方式,让两个基本的8位MCU通过8位UART连接相互通信,将ASCII字符作为8位值发送,将二进制数据作为8位值发送 我宁愿不重新发明轮子,所以我想知道一些ASCII实现是否可以工作,以某种标准方式使用ASCII控制字符 问题是:要么我没有正确理解它,要么它不能做我想做的事情 Wikipedia控制字符页面上说,数据包可以这样发送: -数据链路转义和航向开始 标题数据 数据链接转义和文本开始 数据链接转义和文本结束 但是,如果有效负载是包含两个连续字节的二进制数据,相当

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

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

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

Wikipedia控制字符页面上说,数据包可以这样发送:

  • -数据链路转义和航向开始
  • 标题数据
  • 数据链接转义和文本开始
  • 数据链接转义和文本结束
  • 但是,如果有效负载是包含两个连续字节的二进制数据,相当于DLE和ETX,该怎么办?这些字节应该如何转义

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


    错误检查将在更高级别上进行,以确保接收到的数据包有效-除非ASCII标准也能解决此问题

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

    将数据长度编码为第一个元素可以解决这一问题。如果您有一个惯例,即每个控制字符都需要通过,您可以简单地通过复制将文本添加到有效负载或标头中的数据中。其他控制字符不需要进行任何转义,因为它们只有在前面加上字符时才会被解释为控制,否则将被解释为文字有效负载。如果您希望能够与帧同步,只需等待,然后查看通过7位ASCII介质传输8位二进制数据的
    uuencode
    uudecode
    。这是传统的UNIX方式,通过纯文本电子邮件和USENET帖子发送二进制数据。发送二进制字符或“特殊”字符的另一种方法是使用“转义”字符作为“特殊”字符的前缀,并将字节规范化为有效的ASCII字母数字字符。@tofro“如果希望能够与帧同步,只需等待,然后”--无需等待消息帧结束。只需开始查找消息帧的开头。否则,您可能会不必要地抛出第一条(有效)消息。当然,在消息对齐错误的情况下,必须验证每条消息。例如,如果通道的利用率只有50%,那么当您开始阅读时,您很可能会看到消息中的空闲通道。所以你总是想寻找一个开始,而不是先等待一个结束。